RailsAPI でパスワードリセットを実装したので、議事録として残します。
目的
devise_token_authにて、パスワード再設定を実装する
パスワードリセットの流れ
- パスワードリセットメールを送信する
- 送信されたメールのリンクから、パスワード再設定画面へ遷移する
- パスワードを更新する
passwords_controller.rbの各アクションについて
passwords_controller.rbで定義されている3つのアクションを使用します。
password#create
パスワードリセットメールを送信する
詳細
リクエスト: post passwords#create
パラメータ:redirect_url, email
リクエストのタイミング: 送信ボタンをクリックしたとき
email: リセットメールを送信するメールアドレス。そのメールアドレスを持つユーザーが存在することが前提。
redirect_url: リセットメールをクリックした後に遷移するURL
結果
- ユーザーに認証に使用する情報が登録される
# 更新されるカラム
reset_password_token: nil → トークン
reset_password_sent_at: nil → メール送信日
# reset_password_token: 認証用トークン。リセットメールのリンクにも付与され、editアクションで認証を行うために使用
# reset_password_sent_at: リセットメールの送信日。有効期日かどうかの判定に使用
- リセットメールが送信される
リセットメールのリンクに、ユーザーに付与されたreset_password_tokenがが埋め込まれる
password#edit
リセットメールのリンクに付与されているトークン情報を元に、認証を行う。
認証に成功した場合、パスワード再設定画面に遷移する
詳細
リクエスト:patch password#update
パラメータ: reset_password_token, redirect_url
リクエストのタイミング: 「リセットメールのリンク」をクリックしたとき
結果
-
認証情報の判定を行う
- メールに付与されている tokenと、password#create でユーザーに保存したreset_password_token が一致しているか
- rest_password_sent_at が期日内であるか
-
認証が成功した場合、ユーザーの情報が更新される
# 更新されるカラム
allow_password_change: false → true
- 認証が成功した場合、指定されたURLに遷移する
- password#create で指定されてた redirect_url に遷移する
passwprd#update
詳細
リクエスト:patch password#update
パラメータ:password, password_confirmation,reset_password_token
リクエストのタイミング: 「パスワードの設定ボタン」をクリックした時
*パラメータで必要である reset_password_token
は、urlに付与されているので、それを使用する
# 例
# 分かりやすいように、他のパラメータは省略しています。
# &token="パラメータに含めるトークン"
http://localhost:8000/password_updatereset_password=true&token=S4XXFnUGy1FR2IXinixU9w
結果
- ユーザーのパスワードを更新される
encrypt_password
に再設定したパスワードを暗号化して保存する - パスワード更新に関わるカラムが更新される
# 更新されるカラム
reset_password_token: トークン → nil
reset_password_sent_at: リセットメール送信日 → nil
allow_password_change: true → false
以上の3つのアクションを利用することで、パスワード再設定を実現することができました。
まとめ
- 必要なパラメーター、値がどのように変化するかを把握することができました。
補足
- 有効期限は
devise.rb
で設定できる
# devise.rb
# パスワードの有効期限
config.reset_password_within = 1.hours
- パスワードが変更されたときに再度クリックしたとき、ルーティングエラーになるので、別途対応が必要。