Ruby on Railsでsoceryのreset_passwordを使用した、パスワードリセット機能を実装したのですが、

その中で利用する「トークン」が聞きなれない言葉で、

遊戯王でそんなカードあったなーってレベルでした。

この記事では下記について、書いています。

  1. トークンはいつ作られてどう使われる?
  2. なぜトークンを使うのか
  3. トークンにユニーク制約をつける際の注意点

最初に状況の説明

1.トークンはいつ作られる?

パスワードリセット画面でメールアドレスを入力

送信を押すとpasswordresetsコントローラーのcreateが走る

class PasswordResetsController < ApplicationControlle

  def create
    @user = User.find_by(email: params[:email])
    @user&.deliver_reset_password_instructions!
    redirect_to login_path, success: 'パスワードリセット手順を送信しました'
  end

この中の@user&.deliver_reset_password_instructions!メソッドが実行した時点で binding.pryで止めると、Userカラムのreset_password_tokenに文字列が入ってきたのがわかると思います。 (一番下の行あたり)

   7: def create
     8:   @user = User.find_by(email: params[:email])
     9:   binding.pry
 => 10:   @user&.deliver_reset_password_instructions!
    11:   redirect_to login_path, success: 'パスワードリセット手順を送信しました'
    12: end

[1] pry(#<PasswordResetsController>)> next
  User Update All (3.9ms)  UPDATE "users" SET "reset_password_token" = 'YLpP-sF4xiH1Y1KYpypN', "reset_password_email_sent_at" = '2021-09-25 05:45:05.692469' WHERE "users"."id" = ?  [["id", 2]]