Rails Tutorial 5 Password reset
Rails Tutorial 5 Password reset
ユーザーがパスワードを忘れた場合に備え、パスワード再設定用のメールを送信できる機能を追加する。
- パスワード再設定用トークンの発行
- 対応するダイジェストの保存
と進めていく。
Password resets resource
いつものようにトピックブランチを作成し、
- PasswordResets コントローラの作成
new
,edit
アクションの作成
- new、create、edit、updateのルーティングの追加
- パスワード再設定画面へのリンクの追加
と進める。
次にパスワードリセット用のトークンを発行するが、ここでもデータベースから情報が漏れた場合の被害を抑えるため、ハッシュ化したリセットトークンのダイジェストを保存するようにする。
また、トークンの有効期限を短くしておくことも有効であるため、再設定メール送信時刻も保存する。
User モデルに属性を追加し、マイグレーションを実行する。
$ rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime Running via Spring preloader in process 4226 invoke active_record create db/migrate/20170508234917_add_reset_to_users.rb $ rails db:migrate == 20170508234917 AddResetToUsers: migrating ================================== -- add_column(:users, :reset_digest, :string) -> 0.0064s -- add_column(:users, :reset_sent_at, :datetime) -> 0.0009s == 20170508234917 AddResetToUsers: migrated (0.0086s) =========================
続いて、
- パスワード再設定画面ビューの作成
- フォーム送信されたらPasswordResetsControllerのcreateアクションの実装
- メールアドレスをキーとしてDBからユーザーを検索
- 見つからなければ flash でエラー表示
- パスワード再設定用トークンを更新
- タイムスタンプを更新
- メールアドレスをキーとしてDBからユーザーを検索
と進める。
Password reset emails
メール送信処理を実装する。
- Userメイラーにpassword_resetメソッドを実装する
- テンプレート(txt, html) を作成する
- メールのプレビューメソッドを実装する
- テストの実装
この辺りは前章と同じ流れ。
Resetting the password
いよいよパスワードの再設定を実装していく。
- 送信メールのリンクに対応するフォームを表示するビューを作成
- editアクションからupdateアクションにメールアドレスが渡せるように、フォーム送信時に隠しフィールドとしてメールアドレスも送信する
- PasswordResetsコントローラのeditアクションを実装
- editアクション自体は空だが、beforeフィルタで必要な処理を実行する
- パスワードの更新
- PasswordResetsControllerのupdateアクションを実装
- パスワード再設定の有効期限が切れていないか
- 無効なパスワードであれば失敗させる (失敗した理由も表示する)
- 新しいパスワードが空文字列になっていないか (ユーザー情報の編集ではOKだった)
- モデルに自分で
erros.add
してエラーを追加することができる
- モデルに自分で
- 新しいパスワードが正しければ、更新する
- パスワードの再設定に成功したらダイジェストをnilに
と進め、テストを実装する。
最後に
本番環境でのメール送信方法について再度説明されているが、前章でセットアップ済みなのでデプロイして完了。
その他
なにやら淡々と進められたきがする。
隠しフィールドとか Web 初学者なのでよくわからなかったが、調べるいいきっかけとなった。
セキュリティ的に危ない情報を保存しないよう気をつければ便利に使えそう。