はじめに
パスワードリセットはWebアプリケーションに欠かせない認証フローです。スターターキットを使えばこの機能は自動的に構築されますが、APIのみのプロジェクトや独自UIを構築するプロジェクトでは手動実装が必要です。 手動実装が必要なケース:- API専用バックエンド(フロントエンドがSPA・モバイルアプリ)
- スターターキットを使わずに認証UIを自前で構築する場合
- メール通知やリセットURLのデザインを完全にカスタマイズしたい場合
スターターキット(
laravel new)を使ってプロジェクトを作成した場合、パスワードリセット機能はすでに実装済みです。このページはスターターキットなしで実装する方法を説明します。設定
パスワードリセットの設定はconfig/auth.php の passwords キーで管理します。
driver— データ保存方式(databaseまたはcache)expire— トークンの有効期限(分)。デフォルトは60分throttle— 再送信を制限するまでの待機時間(秒)
ドライバー
database ドライバー
デフォルトのドライバーです。パスワードリセットトークンをデータベースのpassword_reset_tokens テーブルに保存します。このテーブルはLaravelのデフォルトマイグレーション(0001_01_01_000000_create_users_table.php)に含まれています。
cache ドライバー
cache ドライバーはキャッシュストアにトークンを保存します。password_reset_tokens テーブルのマイグレーションが不要になります。トークンはユーザーのメールアドレスをキーとして保存されるため、アプリ内の他の場所でメールアドレスをキャッシュキーとして使用しないよう注意してください。
store キーに専用のキャッシュストアを指定すると、php artisan cache:clear でリセットデータが消去されるのを防げます。指定する値は config/cache.php で設定されているストア名に対応させます。
モデルの準備
パスワードリセット機能を使うには、App\Models\User モデルに2つのトレイトが必要です。
Notifiable— メール通知を送信するために必要CanResetPassword— パスワードリセットトークンの生成・検証に必要なメソッドを提供する
Laravelのデフォルト
User モデルにはすでにこれらのトレイトが含まれています。新規インストールの場合は追加不要です。ルーティングの実装
パスワードリセットには4つのルートが必要です。1. リセットリンクのリクエストフォーム
メールアドレスを入力するフォームを表示します。2. リセットリンクの送信処理
フォームの送信を受け取り、Password::sendResetLink() でリセットメールを送信します。
Password::sendResetLink() はステータスの文字列を返します。
3. パスワードリセットフォーム
メール内のリンクをクリックしたユーザーに新しいパスワードを入力させるフォームを表示します。4. パスワードリセット実行処理
フォームを受け取り、Password::reset() でパスワードを更新します。
Password::reset() のステータス定数:
トークンの有効期限
config/auth.php の expire オプションでトークンの有効期限を分単位で設定できます。デフォルトは60分です。
database ドライバーを使用している場合、期限切れトークンはデータベースに残り続けます。定期的にクリーンアップするには次のArtisanコマンドを使います。
カスタマイズ
カスタム通知の使用
パスワードリセットメールをカスタマイズするには、User モデルで sendPasswordResetNotification メソッドをオーバーライドします。
リセットリンクURLのカスタマイズ
AppServiceProvider の boot メソッドで ResetPassword::createUrlUsing() を使うと、リセットリンクのURLを変更できます。SPAなど別オリジンのフロントエンドにリダイレクトしたい場合に便利です。
Trusted Hostsの設定
パスワードリセットリンクはHTTPリクエストのHost ヘッダーを使って生成されます。不正なホストからのリクエストを防ぐために、bootstrap/app.php でTrusted Hostsを設定することを推奨します。
まとめ
次のステップ
認証入門
Laravelの認証システム全体の仕組みを学びます。
通知
メール通知のカスタマイズ方法を詳しく学びます。