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