Skip to main content

はじめに

パスワードリセットはWebアプリケーションに欠かせない認証フローです。スターターキットを使えばこの機能は自動的に構築されますが、APIのみのプロジェクトや独自UIを構築するプロジェクトでは手動実装が必要です。 手動実装が必要なケース:
  • API専用バックエンド(フロントエンドがSPA・モバイルアプリ)
  • スターターキットを使わずに認証UIを自前で構築する場合
  • メール通知やリセットURLのデザインを完全にカスタマイズしたい場合
スターターキット(laravel new)を使ってプロジェクトを作成した場合、パスワードリセット機能はすでに実装済みです。このページはスターターキットなしで実装する方法を説明します。
パスワードリセットの全体フローは次のとおりです。

設定

パスワードリセットの設定は config/auth.phppasswords キーで管理します。
  • driver — データ保存方式(database または cache)
  • expire — トークンの有効期限(分)。デフォルトは60分
  • throttle — 再送信を制限するまでの待機時間(秒)

ドライバー

database ドライバー

デフォルトのドライバーです。パスワードリセットトークンをデータベースの password_reset_tokens テーブルに保存します。このテーブルはLaravelのデフォルトマイグレーション(0001_01_01_000000_create_users_table.php)に含まれています。

cache ドライバー

Laravel 11以降で利用可能な新しいオプションです。データベーステーブルが不要なため、シンプルな構成でパスワードリセットを実装できます。
cache ドライバーはキャッシュストアにトークンを保存します。password_reset_tokens テーブルのマイグレーションが不要になります。トークンはユーザーのメールアドレスをキーとして保存されるため、アプリ内の他の場所でメールアドレスをキャッシュキーとして使用しないよう注意してください。
store キーに専用のキャッシュストアを指定すると、php artisan cache:clear でリセットデータが消去されるのを防げます。指定する値は config/cache.php で設定されているストア名に対応させます。

モデルの準備

パスワードリセット機能を使うには、App\Models\User モデルに2つのトレイトが必要です。
  • Notifiable — メール通知を送信するために必要
  • CanResetPassword — パスワードリセットトークンの生成・検証に必要なメソッドを提供する
Laravelのデフォルト User モデルにはすでにこれらのトレイトが含まれています。新規インストールの場合は追加不要です。

ルーティングの実装

パスワードリセットには4つのルートが必要です。

1. リセットリンクのリクエストフォーム

メールアドレスを入力するフォームを表示します。
対応するBladeビュー:

2. リセットリンクの送信処理

フォームの送信を受け取り、Password::sendResetLink() でリセットメールを送信します。
Password::sendResetLink() はステータスの文字列を返します。

3. パスワードリセットフォーム

メール内のリンクをクリックしたユーザーに新しいパスワードを入力させるフォームを表示します。
対応するBladeビュー:

4. パスワードリセット実行処理

フォームを受け取り、Password::reset() でパスワードを更新します。
Password::reset() のステータス定数:

トークンの有効期限

config/auth.phpexpire オプションでトークンの有効期限を分単位で設定できます。デフォルトは60分です。
database ドライバーを使用している場合、期限切れトークンはデータベースに残り続けます。定期的にクリーンアップするには次のArtisanコマンドを使います。
スケジューラーで自動化することをおすすめします。

カスタマイズ

カスタム通知の使用

パスワードリセットメールをカスタマイズするには、User モデルで sendPasswordResetNotification メソッドをオーバーライドします。

リセットリンクURLのカスタマイズ

AppServiceProviderboot メソッドで ResetPassword::createUrlUsing() を使うと、リセットリンクのURLを変更できます。SPAなど別オリジンのフロントエンドにリダイレクトしたい場合に便利です。

Trusted Hostsの設定

パスワードリセットリンクはHTTPリクエストの Host ヘッダーを使って生成されます。不正なホストからのリクエストを防ぐために、bootstrap/app.php でTrusted Hostsを設定することを推奨します。
パスワードリセット機能を実装する場合は、Trusted Hostsの設定を必ず確認してください。設定が不十分だとホストヘッダーインジェクション攻撃のリスクがあります。

まとめ

次のステップ

認証入門

Laravelの認証システム全体の仕組みを学びます。

通知

メール通知のカスタマイズ方法を詳しく学びます。
最終更新日 2026年4月15日