実装パターンに倣って、パスワードの再設定でも、トークン用の仮想的な属性とそれに対応するダイジェストを用意していきます。データベースに保存してしまうとすると、攻撃者によってデータベースからトークンを読み出されたとき、セキュリティ上の問題が生じます。攻撃者がユーザーのメールアドレスにパスワード再設定のリクエストを送信し、このメールと盗んだトークンを組み合わせて攻撃者がパスワード再設定リンクを開けば、アカウントを奪い取ることができてしまう、ということです。したがって、パスワードの再設定では必ずダイジェストを使うようにしてください。セキュリティ上の注意点はもう1つあります。期限切れになるようにしなければなりません。そのために、再設定メールの送信時刻も記録する必要があります。12.5の属性を追加します。reset_sent_at:datetime上記の2行目にある>は改行を示すためにシェルが自動的に挿入する文字です。手動で入力しないよう、注意してください。入力できたら、いつものようにマイグレーションを実行しましょう。db:migrate新しいパスワード再設定の画面を作成するために、前回紹介した手法を使うことにします。12.3に再掲したのでご覧ください。12.3と多くの共通点がありますが、重要な違いとして、form_forで扱うリソースとURLが異なっている点と、パスワード属性が省略されている点が挙げられます。