tawara's blog

雑記。個人の見解です。

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

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

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

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

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

github.com

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

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

github.com

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

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

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

こんな感じです。

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

railsguides.jp

最後に

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