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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user = User.find_by(email: params[:email])

token = Rails.application.message_verifier(:password_reset).generate([user.id, 1.day.since])
url = ""
if  ENV["RAILS_ENV"] == "development"
  url = "http://localhost:3000/update_password?token=" + token
else
  url = "http://www.example.com/update_password?token=" + token
end

# パスワード再設定メールの送信
Sender.to_forgot_password_user(user.name, user.email, url).deliver

flash[:sucess] = 'パスワード再発行のメールを送信しました。入力したメールアドレスをご確認ください。'
redirect_to reset_password_path

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

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

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

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

参考

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