【131日目】【1日20分のRailsチュートリアル】【第10章】ログイン画面にパスワード再設定画面へのリンクを追加する
今日は「10.2 パスワードの再設定」から。
10.2 パスワードの再設定
パスワード再設定の仕組みは、アカウント有効化と似ている部分が多く、10.1で学んだ手法の多くをここでも適用できます。
1passwordを導入してからパスワード忘れること減ったけど、それより前にサービス登録したやつなんか結構パスワード再発行(再設定)したりする。。。
アカウント有効化の際と似ていて、PasswordResetsリソースを作成して、再設定用のトークンとそれに対応するダイジェストを保存するのが今回の目的となります。
ふーむ、パスワード再設定フォーム表示するまでの処理は似てる、ってことかな。
10.2.1 PasswordResetsリソース
アカウント有効化 (10.1.1) の場合と同様、最初に新しいリソースで使用するコントローラを生成します。
下記コマンドでコントローラを生成。
$ rails generate controller PasswordResets new edit --no-test-framework create app/controllers/password_resets_controller.rb route get 'password_resets/edit' route get 'password_resets/new' invoke erb create app/views/password_resets create app/views/password_resets/new.html.erb create app/views/password_resets/edit.html.erb invoke helper create app/helpers/password_resets_helper.rb invoke assets invoke coffee create app/assets/javascripts/password_resets.coffee invoke scss create app/assets/stylesheets/password_resets.scss
新しいパスワードを再設定するためのフォーム (図10.8) と、Userモデル内のパスワードを変更するためのフォーム (図10.9) が両方必要になるので、今回はnew、create、edit、updateのルーティングも必要になります。
deleteは要らないからnew、create、edit、updateを指定、ってことなのかな…。
config/routes.rb
resources :password_resets, only: [:new, :create, :edit, :update]
ログイン画面のパスワード入力フォームの上にパスワード再設定画面へのリンクを追加。
app/views/sessions/new.html.erb
<%= link_to "(forgot password)", new_password_reset_path %>
ちゃんとリンク追加できたか見た目確認してみよう。
サーバーを起動して
$ rails server -b $IP -p $PORT
<ローカルアドレス>/login
にアクセス。
テキストリンク追加されてます。
パスワード再設定画面はまだViewいじってないのでデフォルトのまま。
セキュリティ上の注意点をもうひとつ。再設定用のリンクはなるべく短時間 (数時間以内) で期限切れになるようにしなければなりません。そのために、再設定メールの送信時刻も記録する必要があります。
パスワード再設定は期限切れ設定するのか。まぁそうだよね…!
パスワード再設定処理向けにUserモデルにreset_digest属性とreset_sent_at属性を追加する。
$ rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime invoke active_record create db/migrate/20170410023324_add_reset_to_users.rb $ bundle exec rake db:migrate -- add_column(:users, :reset_digest, :string) -> 0.0011s -- add_column(:users, :reset_sent_at, :datetime) -> 0.0004s
追加できたー。
今日の学習時間は【27分】。
次は「10.2.2 PasswordResetsコントローラとフォーム」から。