【Laravel】パスワードリセット機能の実装方法!カスタマイズ

この記事からわかること
- Laravelでパスワードリセット機能を開発する流れ
- メールの送信方法
- カスタマイズや日本語化するには?
index
[open]
\ アプリをリリースしました /
環境
- Laravel:8.83.29
- PHP:8.2.0
- macOS:Sonoma 14.6.1
パスワードリセット機能
Laravelでは認証機能を比較的簡単に実装することが可能です。それに伴いユーザーがパスワードを忘れてログインできなくなった場合の救済措置として必要な「パスワードリセット機能」の簡単に実装できるようになっています。
今回はLaravel8系においてパスワードリセット機能の実装方法をまとめていきます。また前提として認証機能の実装が完了していることが条件になるので未実装の方は以下の記事を参考にしてください。
実装手順
- password_resetsテーブルの作成
- パスワードリセットメール送信処理の実装
- リセット処理の実装
- パスワードリセット入力画面と結果画面のViewを実装
- ルーティングの定義
- .envにメール設定
1.password_resetsテーブルの作成
パスワードリセット機能を使用するためには対象のメールアドレスと発行用のトークンを管理するpassword_resets
テーブルを作成しておく必要があります。このテーブルのマイグレーションファイルはLaravelがデフォルトで用意してくれているのでphp artisan migrate
を実行するだけでOKです。
2.パスワードリセットメール送信処理の実装
続いてパスワードリセットメール送信処理の実装をしていきます。PasswordResetController
(名前は何でも良い)を作成してその中に諸々の処理を記述していきます。
sendResetLinkEmail
メソッドを定義しRequest
で対象のメールアドレスを受け取れるようにしておきます。ここのバリデーション時点でUser
Eloquentに対象のメールアドレスがそもそも存在するかをチェックしています。
実際にメールを送信しているのはPassword::sendResetLink
部分です。Laravelではこの実装だけで決まったテンプレートのパスワードリセットメールを送信してくれます。成功/失敗のステータスでレスポンスだけハンドリングしておきます。
実際に以下のようなデザインのメールが届きます。ユーザーはこのボタンをクリックしてパスワードリセット処理を進める流れになります。

またこのリンクをタップした際に表示するViewは用意されないので自前で用意する必要があります。これは後述しています。
3.リセット処理の実装
続いて実際にパスワードをリセットする処理を実装していきます。reset
メソッドを定義しRequest
では「トークン」、「メールアドレス」、「変更先のパスワード」を受け取ります。
パスワードのリセット処理はPassword::reset
で行います。このメソッドでは内部的に以下のことを実行してくれます。
- メールアドレスとリセットトークンを検証
- usersテーブルのユーザーを取得
- $callback を実行して、新パスワードに更新
- password_resets テーブルから該当するトークンを削除
- Password::PASSWORD_RESET / INVALID_TOKENを返す
パスワードリセットが成功 / 失敗した場合は結果画面Viewへリダイレクトさせます。ここの画面UIの構築も次で作成します。
4.パスワードリセット入力画面と結果画面のViewを実装
これでロジック部分の実装は完了したのであとはViewとルーティングを定義します。resources/views/auth/passwords
配下にblade
ファイルを用意していきます。ここは特に解説はしません。
CSSはBootstrap
を使用してチートしておきます。
5.ルーティングの定義
これでロジックとViewの定義が完了したのルーティングを定義していきます。定義しなければいけないのは以下の4つです。
- パスワードリセットメール送信処理ポイント
- パスワードリセット用画面ルート
- パスワード更新処理ポイント
- パスワードリセット結果画面ルート
パスワードリセットメール送信処理はAPIで実行される想定のためapi.php
に定義しておきます。
残りはweb.php
に定義しておきます。
6..envにメール設定
最後にメールがちゃんと送信できるように.env
にメール設定を追加しておきます。
設定する内容は以下の記事を参考にしてください。
パスワードリセットトークンの有効期限を変更する
パスワードリセットトークンの有効期限を変更
するにはconfig/auth.php
内の以下の部分を変更します。ここで有効期限だけでなく再送可能までのインターバル時間も変更できます。
パスワードリセット
リセットメールのカスタマイズ
パスワードリセットメールの内容をカスタマイズするためには専用のNotification
クラスを用意します。App\Notifications
に,ResetPasswordNotification.php
を作成しtoMail
メソッド部分でカスタマイズしていきます。内容はsubject
で件名をline
などで文を追加することが可能になっています。
作成したらApp\Models
内のUser
でsendPasswordResetNotification
メソッドをオーバーライドして先ほど作成したsendPasswordResetNotification
を使用するように変更しておきます。
これでメール件名や内容を自由にカスタマイズしたものを反映させることができます。
ローカライズして日本語対応
上記のように明示的に文字を指定するのではなくローカライズして日本語対応をしたい場合はローカライズ用のファイルを用意して適応させばOKです。resources/lang/ja/passwords.php
を用意して中に以下のように記述します。
あとはtoMail
メソッドを以下のように修正すればローカライズしたテキストが反映されるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。