Rails 6.0でアプリを開発 基本の流れ⑪ パスワードの再設定
今回はパスワードを忘れた場合の再設定用のコードのメモ
実現したいこと
ログインフォームにパスワードを忘れた場合のリンクを置き、クリックするとフォームが表示。メアドを入力し送信するとメールが届く。そのメール内にあるリンクをクリックすると再設定用のフォームが出てきて再設定できる。
今回の流れ
- 再設定用のリクエストを受けるとメアドをキーにしてDBからユーザーを見つける。
- メアドがDBにある場合は再設定用トークンとそれに対応するリセットダイジェストを生成。
- 再設定用ダイジェストはDBに保存。再設定用トークンはメアドと一緒にユーザーに送信する有効化用のメールのリンクに仕込む。
- ユーザーがリンクをクリックしたら、メアドをキーにしてユーザーを探しDB内で保存しておいた再設定用ダイジェストと比較(トークン認証)
- 認証に成功したらパスワード変更用のフォームを表示。
1)パスワード再設定用のコントローラーの作成
$ rails g controller PasswordResets new edit --no-test-framework
・メールを入力するフォームのnewとパスワードを再設定するフォームのeditのビューがいる
・統合テストでカバーしコントローラーの単体テストをしないのでテストを生成しないオプションを渡している
・その他createとupdateが必要
2)ルーティングの設定
resourceっでnew、edit、create、updateを設定
3)パスワード再設定画面へのリンクを追加
ログインフォーム上に設定
4)マイグレーションにreset_digestとreset_sent_atを追加
・パスワードの再設定もトークン用の仮想的な属性と対応するダイジェストが必要
・再設定用のリンクはなるべく短時間で期限切れにする
$ rails g migration add_reset_to_users reset_digest:string reset_sent_at:datetime
$ rails db:migrate
5)新しいパスワード再設定画面ビュー(メアドを送信するフォーム)
6)パスワード再設定用のcreateアクションの作成
7)Userモデルにパスワード再設定用のメソッドを追加
・createアクション内で呼び出しているメソッドを作成
8)パスワード再設定のリンクをメール送信するメソッドをmailerに記述
9)パスワード再設定のテンプレ
テキストメール
htmlメール
10)パスワード再設定のプレビューメソッドの作成
11)パスワード再設定用メイラーメソッドのテストを追加
12)隠しフィールドでメアドを保存
updateアクションで必要となるメアドを保持するため隠しフィールドとしてページ内に保存する。
※hidden_field_tag内にメアドを保持
フォームから送信すると情報と一緒に保持されったメアドも送信される
- hidden_field_tag :email →params[::email]に保存される
- f.hidden_field :email →params[:user][:email]に保存される
13)editアクションとupdateアクションにbeforeコールバックを設定
editアクションが行われる前にユーザーを見つけ正しいユーザーか確認する
対応するメソッドをprivate内に
14)updateアクションで考慮するケース
- パスワードの有効期限が切れていないか
- 無効なパスワードは失敗させる(理由も表示する)
- 新しいパスワードが空文字になっていないか
- 新しいパスワードが正しければ更新する
15)updateアクション用のコールバックとメソッドおよびupdateアクションを設定
- 有効期限をチェックするメソッドをprivate内に設定
- allow_nilを実装している場合、空文字でも通ってしまうので空文字に引っかかるように明示的にキャッチする →@userオブジェクトにエラーメッセージを追加
- updateはストロングパラメータを使用する
updateメソッドの設定
16)有効期限をチェックするメソッドをUserモデルで定義
17)パスワードの再設定を統合テスト
$ rails g integration_test password_resets
18)パスワードが再設定されたらダイジェストをnilにする
以上です(^^)/
参考にさせていただいたサイト
update_attribute とupdate_attribtues の違い - LukeSilvia’s diary