⭐️パスワードリセット機能の実装

手順

  • 1 . パスワードをリセットするための申請

  • 2 . メールを受信してリンクにアクセス

  • 3 . パスワードを変更

sorceryのreset_passwordモジュールを使用

・sorceryの中のモジュールであるreset_passwordを導入

$ rails g sorcery:install reset_password --only-submodules

・上記コマンドで作成されたmigrationファイルを適用

Image from Gyazo

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]

パスワードリセット画面

ユーザーがパスワードリセットをしたい時に、申請するための画面です。
ここに自分がユーザー登録時に登録したアドレスを入力して送信すると、
パスワードリセットメールがそのアドレスに届き、メールにしたがって手続きを進めていくという仕様。

Image from Gyazo

メール文作成

メール文の作成は下記ファイルで行う。

・app/views/user_mailer/reset_password_email.text.erb ・app/views/user_mailer/reset_password_email.html.erb

Image from Gyazo

Image from Gyazo

ユーザーにメールを送信するメソッド部分

先ほど作成したパスワードリセットするためのメール本文を送信するためのメソッド。
メールを送信するためのコントローラーが下記ファイルになる。

・app/mailers/user_mailer.rb
Image from Gyazo

default from: 'メールの送信元'でメールの送信元のアドレスを指定できる。

mail(to: 宛先,subject: '件名')でメールの宛先、件名を指定

パスワードリセット画面

パスワードリセット申請後、送られてきたメールのURLにアクセスすると、表示される画面の実装。

Image from Gyazo

letter_opener_webを追加し、開発環境では実際のメールは送られないように設定。

以下のような画面をローカルで確認できる!

Image from Gyazo

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

定数置き換え

Image from Gyazo

・Settings.hostで置き換え

config/environments/development.rb

config.action_mailer.default_url_options = { host: Settings.host }

✅総括

今回の課題であるパスワードリセット機能の実装は、
セキュリティ面を厳重にするための構築をしないといけなかったのと、
初めてMailerでユーザーにメールを送信する作業があったりして、
色々と新しいメソッドが出てきたのでとても理解が難しかったです。
ただ、Mailerに関しては色々なgemを取り入れる事によって、より簡易的にコードを書けることが分かりました。
パスワードリセット機能に関しては、どこかでもう一度復習して頭に入れていきたい!!