パスワードリセット機能の処理の流れ

June 21, 2020

こんにちは、たわらです。

本記事は、パスワードリセット機能を実装したときの学びをまとめたものです。

認証管理 Gem Sorcery のモジュールを使う

sorcery を使用しているアプリケーションであれば、Reset Password というモジュールを使うことができます。

https://github.com/Sorcery/sorcery/wiki/Reset-password

この Wiki に従って実装すれば、パスワードリセット機能を実装することができます。

また、開発環境では実際にメールを配信してしまうと何かと面倒なので、実際には発信してないにもかかわらず、発信したメールの挙動を確認できるletter_opener_webを使うとスムーズに開発ができます。

https://github.com/fgrehm/letter_opener_web

パスワードリセット機能の処理の流れ

パスワードリセット機能の処理の流れを理解しましょう。

1  【クライアント】パスワードリセットページにて、登録しているメールアドレスを打ち込む

2  『 サーバー 』パスワードリセット申請時に、一意のトークンを発行してユーザーテーブルのトークンカラムに保存しておく。入力されたメールアドレスに、パスワードリセットページへのリンクを含めた案内メールを発信。このとき、URL に一意のトークンを含める。

password_resetsコントロールの create アクションで、この処理を行う)

こんな感じの URL になる。

http://hogehoge/password_resets/zKsb7u8hysvZdqyqqKfiy/edit

zKsb7u8hysvZdqyqqKfiyの部分がトークンですね。

3  【クライアント】メールを開いて、URL をクリックする

4  『 サーバー 』送られてきた URL からから取得したトークンで、ユーザーテーブルのトークンカラムを検索する。

もし、取得したトークンと一致するトークンが DB になければ、ログイン画面に戻す

もし、取得したトークンと一致するトークンが DB にあれば、パスワード更新画面を表示する

5 【クライアント】パスワード更新画面で、パスワードを更新する

6 『 サーバー 』フォームから送られてきた新しいパスワードを取得して DB に保存する。

(この過程で、パスワードリセットトークンを削除する=nilを代入するので、ユーザークラスで、トークンのカラムにnilが入ってもいいように、

validates :reset_password_token, uniqueness: true, allow_nil: true

と記述する。しないと、エラーが出てしまう)

ざっとこんな感じになりました。

Action Mailer の基礎に目を通す

メーラークラスに必要なコードを記述すれば、メール内で使えるインスタンス変数や、メールの宛先、メールアドレスの題名などを決めることができます。

class UserMailer < ApplicationMailer
  default from: 'notifications@example.com'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: '私の素敵なサイトへようこそ')
  end
end

こんな感じです。

他にも、さまざまなオプションがあるので、メール機能を実装するときには、必ず参照しようと思います。

https://railsguides.jp/action_mailer_basics.html

最後に

読んでくださったかた、ありがとうございます。