7
7

More than 1 year has passed since last update.

【Rails】devise_token_auth でパスワードをリセットする流れをまとめる

Last updated at Posted at 2022-08-16

RailsAPI でパスワードリセットを実装したので、議事録として残します。

目的

devise_token_authにて、パスワード再設定を実装する

パスワードリセットの流れ

スクリーンショット 2022-05-29 15.51.39.png

  1. パスワードリセットメールを送信する
  2. 送信されたメールのリンクから、パスワード再設定画面へ遷移する
  3. パスワードを更新する

passwords_controller.rbの各アクションについて

passwords_controller.rbで定義されている3つのアクションを使用します。

password#create

パスワードリセットメールを送信する

スクリーンショット 2022-05-29 15.49.57.png

詳細

リクエスト: 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

リセットメールのリンクに付与されているトークン情報を元に、認証を行う。

認証に成功した場合、パスワード再設定画面に遷移する

スクリーンショット 2022-05-29 15.49.13.png

詳細

リクエスト: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

パスワードを更新する
スクリーンショット 2022-05-29 15.49.31.png

詳細

リクエスト: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つのアクションを利用することで、パスワード再設定を実現することができました。

まとめ

  • 必要なパラメーター、値がどのように変化するかを把握することができました。

補足

  1. 有効期限は devise.rb で設定できる
# devise.rb

# パスワードの有効期限
config.reset_password_within = 1.hours
  1. パスワードが変更されたときに再度クリックしたとき、ルーティングエラーになるので、別途対応が必要。
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7