読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【131日目】【1日20分のRailsチュートリアル】【第10章】ログイン画面にパスワード再設定画面へのリンクを追加する

Ruby on Railsチュートリアル(第3版)

今日は「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

にアクセス。

f:id:kt_zoe:20170410130325p:plain

テキストリンク追加されてます。

f:id:kt_zoe:20170410130336p:plain

パスワード再設定画面はまだViewいじってないのでデフォルトのまま。

セキュリティ上の注意点をもうひとつ。再設定用のリンクはなるべく短時間 (数時間以内) で期限切れになるようにしなければなりません。そのために、再設定メールの送信時刻も記録する必要があります。

パスワード再設定は期限切れ設定するのか。まぁそうだよね…!

以下を実行して、マイグレーション図10.11の属性を追加します。

パスワード再設定処理向けに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コントローラとフォーム」から。