Sorceryを使ってパスワードリセット機能を実装してみた①(学んだこと)
今回は、gem:sorceryを使ってパスワードリセット機能を実装してみたので、その過程で学んだことや解決したエラーを2記事に渡ってまとめました。
今回の実装では以下のQiitaの記事を参考にさせていただきました。
【Rails】sorceryのパスワードリセット機能(トークンがどのように使用されているのか) - Qiita
sorceryのパスワードリセットを実装(reset_passwordモジュール) - Qiita
実装する上でのポイント、学んだ事
user.rb内
validates :reset_password_token, uniqueness: true, allow_nil: true
・tokenは一度きりなので、パスワードをリセットするとtokenの中身はnilにな離、一意のものではなくなってしまいバリデーションに引っかかってしまう。そこでallow_nil: true
を記述し、nilの際にuniqueness: trueが発動しないように変更する。
sorcery.rb内のコード
Rails.application.config.sorcery.configure do |config| config.user_config do |user| . . . user.reset_password_mailer = UserMailer end end
・この中のuser.reset_password_mailer = UserMailer
は、すでにsorcery.rb内にあるコードをコメントアウトし、UserMailerを書き込むだけで良いl。また、configファイルを変更した際は、必ずサーバーを再起動する。
password_resetsコントローラー
def edit 〜省略〜 @user = User.load_from_reset_password_token(params[:id])
load_from_reset_password_token(params[:id])
について、urlから渡されたparams[:id] (トークン)によって該当するユーザーを検索すると同時にトークンの有効期限も確認し、問題がなければ@userに代入している。
・gem:configについて
本番環境、開発環境、テスト環境などでホスト(ドメイン)は変わってくるので、それを管理しやすくするためのもの。
導入すると、
config/settings/development.yml config/settings/production.yml config/settings/test.yml
の3種類のymlファイルが追加される。
開発環境でのホストはlocalhost:3000なので、development.ymlで
host: ‘localhost:3000’
のように記述する。
同様に、本番環境では自らで取得したドメインをproduction.yml内に記述すれば良い。