パスワードリセット機能の処理の流れ
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
最後に
読んでくださったかた、ありがとうございます。