Menu

Category

Archive

logo


Railsでパスワード再設定メール機能の実装 ~ Message Verifiers ~

2015-02-28 08:30:00 +0900
  • このエントリーをはてなブックマークに追加

Railsでメールアドレス/パスワード認証のあるようなサービスにおいて、パスワードを忘れてしまったユーザーにメールアドレスからユーザーを取得し、パスワードを再設定する実装方法。Rails4.1?からは、Message Verifiersというものが使え簡単に実装できるようです。

1. メールアドレスとユーザーIDからトークンの作成

まずは単純なフォームからユーザー情報に紐付いているメールアドレスを取得します。そしてユーザーを割り出し、そのユーザーIDを使ってトークンを作成します。このトークンが後でパスワード再設定メールが有効かどうかを判断する大事なもので、RailsのMessage Verifiersで簡単に作成できます。ここでは、このトークンの有効期限を1日に設定しています。

 1 user = User.find_by(email: params[:email])
 2 
 3 token = Rails.application.message_verifier(:password_reset).generate([user.id, 1.day.since])
 4 url = ""
 5 if  ENV["RAILS_ENV"] == "development"
 6   url = "http://localhost:3000/update_password?token=" + token
 7 else
 8   url = "http://www.example.com/update_password?token=" + token
 9 end
10 
11 # パスワード再設定メールの送信
12 Sender.to_forgot_password_user(user.name, user.email, url).deliver
13 
14 flash[:sucess] = 'パスワード再発行のメールを送信しました。入力したメールアドレスをご確認ください。'
15 redirect_to reset_password_path

上記のトークンを使用して、パスワードを再設定できるフォームへのURLを作成します。

2. パスワード再設定画面での認証

後は、下記のようにパスワード認証メールの期限が切れていないか確認をして、適宜パスワードを再設定すればOKです。

1 user_id, expire_at = Rails.application.message_verifier(:password_reset).verify(params[:token])
2 user = User.find(user_id)
3 if Time.now.utc.to_i < expire_at.to_i && user != nil
4   # パスワード再設定のメールは有効
5   # 適宜パスワード入力フォームへリダイレクトや、パスワード検証をして更新           
6 else
7   # このパスワード更新メールの有効期限が既に切れている
8   # 再度パスワード更新するためのメールアドレス入力フォームへリダイレクトや、エラーメッセージの表示
9 end

参考

MessageVerifier を使えばパスワード再発行メールの実装が簡単になる
2.6 Message Verifiers