techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

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 でエラー表示
    • パスワード再設定用トークンを更新
    • タイムスタンプを更新

と進める。

Password reset emails

メール送信処理を実装する。

  • Userメイラーにpassword_resetメソッドを実装する
  • テンプレート(txt, html) を作成する
  • メールのプレビューメソッドを実装する
  • テストの実装

この辺りは前章と同じ流れ。

Resetting the password

いよいよパスワードの再設定を実装していく。

  • 送信メールのリンクに対応するフォームを表示するビューを作成
    • editアクションからupdateアクションにメールアドレスが渡せるように、フォーム送信時に隠しフィールドとしてメールアドレスも送信する
  • PasswordResetsコントローラのeditアクションを実装
    • editアクション自体は空だが、beforeフィルタで必要な処理を実行する
  • パスワードの更新
    • PasswordResetsControllerのupdateアクションを実装
    • パスワード再設定の有効期限が切れていないか
    • 無効なパスワードであれば失敗させる (失敗した理由も表示する)
    • 新しいパスワードが空文字列になっていないか (ユーザー情報の編集ではOKだった)
      • モデルに自分で erros.add してエラーを追加することができる
    • 新しいパスワードが正しければ、更新する
    • パスワードの再設定に成功したらダイジェストをnilに

と進め、テストを実装する。

最後に

本番環境でのメール送信方法について再度説明されているが、前章でセットアップ済みなのでデプロイして完了。

その他

なにやら淡々と進められたきがする。

隠しフィールドとか Web 初学者なのでよくわからなかったが、調べるいいきっかけとなった。
セキュリティ的に危ない情報を保存しないよう気をつければ便利に使えそう。