⭐️パスワードリセット機能の実装
手順
1 . パスワードをリセットするための申請
2 . メールを受信してリンクにアクセス
3 . パスワードを変更
sorceryのreset_passwordモジュールを使用
・sorceryの中のモジュールであるreset_passwordを導入
$ rails g sorcery:install reset_password --only-submodules
・上記コマンドで作成されたmigrationファイルを適用
rails db:migrate
・tokenにユニーク制約
トークンは唯一無二でなけれならない。
被ると、別の人のパスワードを変更できてしまう。
user.rb validates :email, presence: true, uniqueness: true validates :reset_password_token, presence: true, uniqueness: true
・UserMailerという名前でパスワードリセットメール用のMailerを作成
$ rails g mailer UserMailer reset_password_email
・sorcery.rbにreset_passwordサブモジュールを追加し、パスワードリセットに使用するActionMailerとしてUserMailerを定義
sorcery.rb Rails.application.config.sorcery.submodules = [:reset_password] Rails.application.config.sorcery.configure do |config| config.user_config do |user| user.reset_password_mailer = UserMailer end end
※sorceryの定義ファイルに、使用するサブモジュール記述があることが多いが、もし、Rails.application.config.sorcery.submodules = [:reset_password])や、user.reset_password_mailer = UserMailer入っていなければ、sorcery.rbに追記する
ルーティング、コントローラー、viewファイル作成
rails g controller PasswordResets new create edit update
・ルーティング設定
resources :password_resets, only: %i[new create edit update]
パスワードリセット画面
ユーザーがパスワードリセットをしたい時に、申請するための画面です。
ここに自分がユーザー登録時に登録したアドレスを入力して送信すると、
パスワードリセットメールがそのアドレスに届き、メールにしたがって手続きを進めていくという仕様。
メール文作成
メール文の作成は下記ファイルで行う。
・app/views/user_mailer/reset_password_email.text.erb ・app/views/user_mailer/reset_password_email.html.erb
ユーザーにメールを送信するメソッド部分
先ほど作成したパスワードリセットするためのメール本文を送信するためのメソッド。
メールを送信するためのコントローラーが下記ファイルになる。
・default from: 'メールの送信元'
でメールの送信元のアドレスを指定できる。
・mail(to: 宛先,subject: '件名')
でメールの宛先、件名を指定
パスワードリセット画面
パスワードリセット申請後、送られてきたメールのURLにアクセスすると、表示される画面の実装。
letter_opener_webを追加し、開発環境では実際のメールは送られないように設定。
以下のような画面をローカルで確認できる!
Gemfileにletter_opener_webを追加する
group :development do gem 'letter_opener_web' end
bundle install
ルーティングにLetterOpenerWebアクセスするために必要な記述を追記
一番下に以下の記述を追記。
mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development?
config/environments/development.rbに設定を追加
Rails.application.configure do 省略... config.action_mailer.perform_caching = false config.action_mailer.default_url_options = { host: 'localhost:3000' } config.action_mailer.delivery_method = :letter_opener_web 省略... end
メールが送られたか確認する
・http://localhost:3000/letter_opener
にアクセス
環境変数の設定
・host情報はconfigというgemを使ってsettings/development.ymlに記載する
gem 'config'
でbundle install
gemの機能で設定ファイルを生成
rails g config:install
カスタマイズ可能な設定ファイルconfig/initializers/config.rbとデフォルト設定ファイルのセットを生成
→
config/settings.yml
config/settings/development.yml
config/settings/production.yml
config/settings/test.yml
定数置き換え
・Settings.hostで置き換え
config/environments/development.rb
config.action_mailer.default_url_options = { host: Settings.host }
✅総括
今回の課題であるパスワードリセット機能の実装は、
セキュリティ面を厳重にするための構築をしないといけなかったのと、
初めてMailerでユーザーにメールを送信する作業があったりして、
色々と新しいメソッドが出てきたのでとても理解が難しかったです。
ただ、Mailerに関しては色々なgemを取り入れる事によって、より簡易的にコードを書けることが分かりました。
パスワードリセット機能に関しては、どこかでもう一度復習して頭に入れていきたい!!