サマリ
- パスワードの再設定
- パスワード再設定メールの送信
- トークンによる認証とパスワードの再設定
ポイント
- パスワードリセット機能はUserモデルを拡張して使用するため、MVCのうち新たに作成するのはViewとControllerのみで良い
- 処理のコントローラーのアクションがいろいろ登場するので、流れを整理しないと混乱する
sessions/new.html.erb
→password_resets_controller#new
→password_resets/new.html.erb
→password_resets_controller#create
→メール送信
→password_resets_controller#edit
→password_resets/edit.html.erb
→password_resets#update
-
@user.authenticated?(:reset, params[:id])
でresetトークンとDBに保存されたダイジェストを照合する - パスワード再設定用メールを送信する際に、パスワードリセットトークンとダイジェストを生成する。
- トークンはメール内のリンクに埋め込んでユーザーに送付する
- ダイジェストはDBに保存し、リンクが開かれた際に両者を照合して本人であることを確認する
- #edit時点では、メール内のリンクに埋め込んだURLパラメーターからメールアドレスを取得できるが、#updateは画面から呼び出すので、同じ方法でメールアドレスを取得することができない。そのため、edit.html.erbの中の隠しフィールドにメールアドレスを持たせて#updateに引き渡す。
<%= hidden_field_tag :email, @user.email %>
感想
- 11章と内容的にはほぼ同じだったが、その分説明が少なくて少し混乱した
- herokuでの動作は問題なかったが、ローカル動作時にパスワード再設定用リンクを開こうとすると画面に
このサイトは安全に接続できませんlocalhostから無効な応答が送信されました。
と表示され、ログに以下が吐かれてしまった
2020-03-18 02:53:45 +0900: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
- 原因はメールリンクがhttpsになっているためで、httpでリンクを開くと画面が正常に表示された
- localhostにhttpsで繋ぐ場合は少し追加の設定が必要 参考記事