はじめに

Laravel Fortify は、Laravel 用のフロントエンドに依存しない認証バックエンドの実装です。Fortify は、ログイン、登録、パスワードリセット、メール確認など、Laravel のすべての認証機能を実装するために必要なルートとコントローラーを登録します。Fortify をインストールした後、route:list Artisan コマンドを実行して、Fortify が登録したルートを確認できます。

Fortify は独自のユーザーインターフェースを提供しないため、登録したルートにリクエストを送信する独自のユーザーインターフェースと組み合わせて使用することを意図しています。このドキュメントの残りの部分では、これらのルートにリクエストを送信する方法について詳しく説明します。

覚えておいてください、Fortify は Laravel の認証機能を実装するためのスタート地点を提供するパッケージです。使用する必要はありません。 認証パスワードリセット、および メール確認 のドキュメントに従って、Laravel の認証サービスと手動で対話することは常に自由です。

Fortify とは何ですか?

前述のように、Laravel Fortify は Laravel 用のフロントエンドに依存しない認証バックエンドの実装です。Fortify は、ログイン、登録、パスワードリセット、メール確認など、Laravel のすべての認証機能を実装するために必要なルートとコントローラーを登録します。

Laravel の認証機能を使用するために Fortify を使用する必要はありません。 認証パスワードリセット、および メール確認 のドキュメントに従って、Laravel の認証サービスと手動で対話することは常に自由です。

Laravel に不慣れな場合は、Laravel Fortify を使用する前に Laravel Breeze アプリケーションスターターキットを探索することをお勧めします。Laravel Breeze は、Tailwind CSS で構築されたユーザーインターフェースを含むアプリケーションの認証スキャフォールディングを提供します。Fortify とは異なり、Breeze はルートとコントローラーを直接アプリケーションに公開します。これにより、Laravel Fortify がこれらの機能を実装する前に、Laravel の認証機能を学び、快適に感じることができます。

Laravel Fortify は、基本的に Laravel Breeze のルートとコントローラーを取り込み、ユーザーインターフェースを含まないパッケージとして提供します。これにより、特定のフロントエンドの意見に縛られることなく、アプリケーションの認証レイヤーのバックエンド実装を迅速にスキャフォールディングできます。

Fortify を使用すべき時期は?

Laravel Fortify を使用するのが適切な時期について疑問に思うかもしれません。まず、Laravel の アプリケーションスターターキット のいずれかを使用している場合、すべての Laravel のアプリケーションスターターキットはすでに完全な認証実装を提供しているため、Laravel Fortify をインストールする必要はありません。

アプリケーションスターターキットを使用しておらず、アプリケーションに認証機能が必要な場合、2 つのオプションがあります:アプリケーションの認証機能を手動で実装するか、Laravel Fortify を使用してこれらの機能のバックエンド実装を提供するかです。

Fortify をインストールすることを選択した場合、ユーザーインターフェースは、このドキュメントで詳述されている Fortify の認証ルートにリクエストを送信して、ユーザーを認証および登録します。

Fortify を使用する代わりに Laravel の認証サービスと手動で対話することを選択した場合、認証パスワードリセット、および メール確認 のドキュメントに従って行うことができます。

Laravel Fortify と Laravel Sanctum

一部の開発者は、Laravel Sanctum と Laravel Fortify の違いについて混乱することがあります。これらの 2 つのパッケージは異なるが関連する問題を解決するため、Laravel Fortify と Laravel Sanctum は相互排他的または競合するパッケージではありません。

Laravel Sanctum は、API トークンの管理と、セッションクッキーまたはトークンを使用して既存のユーザーを認証することにのみ関心があります。Sanctum は、ユーザー登録、パスワードリセットなどを処理するルートを提供しません。

API を提供するアプリケーションの認証レイヤーを手動で構築しようとしている場合、ユーザー登録、パスワードリセットなどのために Laravel Fortify を利用し、API トークン管理、セッション認証のために Laravel Sanctum を利用することは十分に可能です。

インストール

始めるには、Composer パッケージマネージャーを使用して Fortify をインストールします:

  1. composer require laravel/fortify

次に、fortify:install Artisan コマンドを使用して Fortify のリソースを公開します:

  1. php artisan fortify:install

このコマンドは、Fortify のアクションを app/Actions ディレクトリに公開します。このディレクトリは存在しない場合に作成されます。さらに、FortifyServiceProvider、設定ファイル、およびすべての必要なデータベースマイグレーションが公開されます。

次に、データベースをマイグレーションする必要があります:

  1. php artisan migrate

Fortify の機能

fortify 設定ファイルには、features 設定配列が含まれています。この配列は、Fortify がデフォルトで公開するバックエンドルート/機能を定義します。Fortify を Laravel Jetstream と組み合わせて使用していない場合は、ほとんどの Laravel アプリケーションが提供する基本的な認証機能である以下の機能のみを有効にすることをお勧めします:

  1. 'features' => [
  2. Features::registration(),
  3. Features::resetPasswords(),
  4. Features::emailVerification(),
  5. ],

ビューの無効化

デフォルトでは、Fortify はログイン画面や登録画面などのビューを返すことを意図したルートを定義します。ただし、JavaScript ドリブンのシングルページアプリケーションを構築している場合、これらのルートは必要ないかもしれません。そのため、アプリケーションの config/fortify.php 設定ファイル内の views 設定値を false に設定することで、これらのルートを完全に無効にすることができます:

  1. 'views' => false,

ビューとパスワードリセットの無効化

Fortify のビューを無効にし、アプリケーションのパスワードリセット機能を実装する場合、アプリケーションの「パスワードリセット」ビューを表示する責任を持つ password.reset という名前のルートを定義する必要があります。これは、Laravel の Illuminate\Auth\Notifications\ResetPassword 通知が password.reset という名前のルートを介してパスワードリセット URL を生成するために必要です。

認証

始めるには、Fortify に「ログイン」ビューを返す方法を指示する必要があります。覚えておいてください、Fortify はヘッドレス認証ライブラリです。Laravel の認証機能のフロントエンド実装がすでに完成している場合は、アプリケーションスターターキット を使用するべきです。

すべての認証ビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出すべきです。Fortify は、このビューを返す /login ルートを定義することを担当します:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::loginView(function () {
  8. return view('auth.login');
  9. });
  10. // ...
  11. }

ログインテンプレートには、/login に POST リクエストを送信するフォームを含める必要があります。/login エンドポイントは、文字列 email / usernamepassword を期待します。メール/ユーザー名フィールドの名前は、config/fortify.php 設定ファイル内の username 値と一致する必要があります。さらに、ユーザーが Laravel によって提供される「記憶する」機能を使用したいことを示すために、ブール値 remember フィールドを提供することができます。

ログイン試行が成功した場合、Fortify はアプリケーションの fortify 設定ファイル内の home 設定オプションを介して構成された URI にリダイレクトします。ログインリクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。

リクエストが成功しなかった場合、ユーザーはログイン画面にリダイレクトされ、検証エラーは共有 $errors Blade テンプレート変数を介して利用可能になります。また、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。

ユーザー認証のカスタマイズ

Fortify は、提供された資格情報とアプリケーションに設定された認証ガードに基づいてユーザーを自動的に取得し、認証します。ただし、ログイン資格情報がどのように認証され、ユーザーがどのように取得されるかを完全にカスタマイズしたい場合があります。幸いなことに、Fortify は Fortify::authenticateUsing メソッドを使用してこれを簡単に実現できます。

このメソッドは、受信した HTTP リクエストを受け取るクロージャを受け入れます。クロージャは、リクエストに添付されたログイン資格情報を検証し、関連するユーザーインスタンスを返す責任があります。資格情報が無効であるか、ユーザーが見つからない場合、クロージャは null または false を返す必要があります。通常、このメソッドは boot メソッドから呼び出されるべきです。

  1. use App\Models\User;
  2. use Illuminate\Http\Request;
  3. use Illuminate\Support\Facades\Hash;
  4. use Laravel\Fortify\Fortify;
  5. /**
  6. * Bootstrap any application services.
  7. */
  8. public function boot(): void
  9. {
  10. Fortify::authenticateUsing(function (Request $request) {
  11. $user = User::where('email', $request->email)->first();
  12. if ($user &&
  13. Hash::check($request->password, $user->password)) {
  14. return $user;
  15. }
  16. });
  17. // ...
  18. }

認証ガード

アプリケーションの fortify 設定ファイル内で Fortify が使用する認証ガードをカスタマイズできます。ただし、設定されたガードが Illuminate\Contracts\Auth\StatefulGuard の実装であることを確認する必要があります。Laravel Fortify を使用して SPA を認証しようとしている場合は、Laravel のデフォルトの web ガードを Laravel Sanctum と組み合わせて使用する必要があります。

認証パイプラインのカスタマイズ

Laravel Fortify は、呼び出し可能なクラスのパイプラインを通じてログインリクエストを認証します。ログインリクエストが通過すべきカスタムパイプラインのクラスを定義することができます。各クラスは、受信した Illuminate\Http\Request インスタンスを受け取り、ミドルウェア のように、リクエストを次のクラスに渡すために呼び出される $next 変数を持つ invoke メソッドを持つ必要があります。

カスタムパイプラインを定義するには、Fortify::authenticateThrough メソッドを使用できます。このメソッドは、ログインリクエストを通過させるクラスの配列を返すクロージャを受け入れます。通常、このメソッドは boot メソッドから呼び出されるべきです。

以下の例は、独自の変更を行う際の出発点として使用できるデフォルトのパイプライン定義を含んでいます:

  1. use Laravel\Fortify\Actions\AttemptToAuthenticate;
  2. use Laravel\Fortify\Actions\CanonicalizeUsername;
  3. use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
  4. use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
  5. use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
  6. use Laravel\Fortify\Features;
  7. use Laravel\Fortify\Fortify;
  8. use Illuminate\Http\Request;
  9. Fortify::authenticateThrough(function (Request $request) {
  10. return array_filter([
  11. config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
  12. config('fortify.lowercase_usernames') ? CanonicalizeUsername::class : null,
  13. Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
  14. AttemptToAuthenticate::class,
  15. PrepareAuthenticatedSession::class,
  16. ]);
  17. });

認証のスロットリング

デフォルトでは、Fortify は EnsureLoginIsNotThrottled ミドルウェアを使用して認証試行をスロットリングします。このミドルウェアは、ユーザー名と IP アドレスの組み合わせに固有の試行をスロットリングします。

一部のアプリケーションでは、IP アドレスのみで認証試行をスロットリングするなど、異なるアプローチが必要な場合があります。そのため、Fortify は fortify.limiters.login 設定オプションを介して独自の レートリミッター を指定できるようにしています。この設定オプションは、アプリケーションの config/fortify.php 設定ファイルにあります。

スロットリング、二要素認証、および外部 Web アプリケーションファイアウォール (WAF) の組み合わせを利用することで、正当なアプリケーションユーザーに対して最も堅牢な防御を提供します。

リダイレクトのカスタマイズ

ログイン試行が成功した場合、Fortify はアプリケーションの fortify 設定ファイル内の home 設定オプションを介して構成された URI にリダイレクトします。ログインリクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。ユーザーがアプリケーションからログアウトすると、ユーザーは / URI にリダイレクトされます。

この動作の高度なカスタマイズが必要な場合は、Laravel サービスコンテナLoginResponse および LogoutResponse コントラクトの実装をバインドできます。通常、これはアプリケーションの App\Providers\FortifyServiceProvider クラスの register メソッド内で行うべきです:

  1. use Laravel\Fortify\Contracts\LogoutResponse;
  2. /**
  3. * Register any application services.
  4. */
  5. public function register(): void
  6. {
  7. $this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
  8. public function toResponse($request)
  9. {
  10. return redirect('/');
  11. }
  12. });
  13. }

二要素認証

Fortify の二要素認証機能が有効になっている場合、ユーザーは認証プロセス中に 6 桁の数値トークンを入力する必要があります。このトークンは、Google Authenticator などの TOTP 互換のモバイル認証アプリから取得できる時間ベースのワンタイムパスワード (TOTP) を使用して生成されます。

始める前に、アプリケーションの App\Models\User モデルが Laravel\Fortify\TwoFactorAuthenticatable トレイトを使用していることを確認してください:

  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Foundation\Auth\User as Authenticatable;
  4. use Illuminate\Notifications\Notifiable;
  5. use Laravel\Fortify\TwoFactorAuthenticatable;
  6. class User extends Authenticatable
  7. {
  8. use Notifiable, TwoFactorAuthenticatable;
  9. }

次に、ユーザーが二要素認証設定を管理できる画面をアプリケーション内に構築する必要があります。この画面では、ユーザーが二要素認証を有効または無効にしたり、二要素認証の回復コードを再生成したりできるようにします。

デフォルトでは、features 配列の fortify 設定ファイルは、変更前にパスワード確認を要求するように Fortify の二要素認証設定を指示します。したがって、アプリケーションは Fortify の パスワード確認 機能を実装する必要があります。

二要素認証の有効化

二要素認証を有効にするには、アプリケーションは Fortify によって定義された /user/two-factor-authentication エンドポイントに POST リクエストを送信する必要があります。リクエストが成功した場合、ユーザーは前の URL にリダイレクトされ、status セッション変数が two-factor-authentication-enabled に設定されます。この status セッション変数をテンプレート内で検出して、適切な成功メッセージを表示できます。リクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。

二要素認証を有効にすることを選択した後、ユーザーは有効な二要素認証コードを提供して、二要素認証設定を「確認」する必要があります。したがって、成功メッセージは、ユーザーに二要素認証の確認がまだ必要であることを指示する必要があります:

  1. @if (session('status') == 'two-factor-authentication-enabled')
  2. <div class="mb-4 font-medium text-sm">
  3. Please finish configuring two factor authentication below.
  4. </div>
  5. @endif

次に、ユーザーが認証アプリケーションにスキャンできる二要素認証 QR コードを表示する必要があります。Blade を使用してアプリケーションのフロントエンドをレンダリングしている場合、ユーザーインスタンスで利用可能な twoFactorQrCodeSvg メソッドを使用して QR コード SVG を取得できます:

  1. $request->user()->twoFactorQrCodeSvg();

JavaScript ベースのフロントエンドを構築している場合、/user/two-factor-qr-code エンドポイントに XHR GET リクエストを送信して、ユーザーの二要素認証 QR コードを取得できます。このエンドポイントは、svg キーを含む JSON オブジェクトを返します。

二要素認証の確認

ユーザーの二要素認証 QR コードを表示するだけでなく、ユーザーが二要素認証設定を「確認」するために有効な認証コードを提供できるテキスト入力を提供する必要があります。このコードは、Fortify によって定義された /user/confirmed-two-factor-authentication エンドポイントへの POST リクエストを介して Laravel アプリケーションに提供される必要があります。

リクエストが成功した場合、ユーザーは前の URL にリダイレクトされ、status セッション変数が two-factor-authentication-confirmed に設定されます:

  1. @if (session('status') == 'two-factor-authentication-confirmed')
  2. <div class="mb-4 font-medium text-sm">
  3. Two factor authentication confirmed and enabled successfully.
  4. </div>
  5. @endif

二要素認証確認エンドポイントへのリクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。

回復コードの表示

ユーザーの二要素回復コードも表示する必要があります。これらの回復コードは、ユーザーがモバイルデバイスへのアクセスを失った場合に認証を行うことを可能にします。Blade を使用してアプリケーションのフロントエンドをレンダリングしている場合、認証されたユーザーインスタンスを介して回復コードにアクセスできます:

  1. (array) $request->user()->recoveryCodes()

JavaScript ベースのフロントエンドを構築している場合、/user/two-factor-recovery-codes エンドポイントに XHR GET リクエストを送信できます。このエンドポイントは、ユーザーの回復コードを含む JSON 配列を返します。

ユーザーの回復コードを再生成するには、アプリケーションは /user/two-factor-recovery-codes エンドポイントに POST リクエストを送信する必要があります。

二要素認証による認証

認証プロセス中、Fortify は自動的にユーザーをアプリケーションの二要素認証チャレンジ画面にリダイレクトします。ただし、アプリケーションが XHR ログインリクエストを行っている場合、成功した認証試行の後に返される JSON レスポンスには、two_factor ブールプロパティを持つ JSON オブジェクトが含まれます。この値を確認して、アプリケーションの二要素認証チャレンジ画面にリダイレクトする必要があるかどうかを判断します。

二要素認証機能を実装するには、Fortify に二要素認証チャレンジビューを返す方法を指示する必要があります。Fortify のすべての認証ビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::twoFactorChallengeView(function () {
  8. return view('auth.two-factor-challenge');
  9. });
  10. // ...
  11. }

Fortify は、このビューを返す /two-factor-challenge ルートを定義することを担当します。two-factor-challenge テンプレートには、/two-factor-challenge エンドポイントに POST リクエストを送信するフォームを含める必要があります。/two-factor-challenge アクションは、有効な TOTP トークンを含む code フィールドまたはユーザーの回復コードのいずれかを含む recovery_code フィールドを期待します。

ログイン試行が成功した場合、Fortify はアプリケーションの fortify 設定ファイル内の home 設定オプションを介して構成された URI にユーザーをリダイレクトします。ログインリクエストが XHR リクエストであった場合、204 HTTP レスポンスが返されます。

リクエストが成功しなかった場合、ユーザーは二要素チャレンジ画面にリダイレクトされ、検証エラーは共有 $errors Blade テンプレート変数を介して利用可能になります。また、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。

二要素認証の無効化

二要素認証を無効にするには、アプリケーションは /user/two-factor-authentication エンドポイントに DELETE リクエストを送信する必要があります。覚えておいてください、Fortify の二要素認証エンドポイントは呼び出される前に パスワード確認 を必要とします。

登録

アプリケーションの登録機能を実装するには、Fortify に「登録」ビューを返す方法を指示する必要があります。覚えておいてください、Fortify はヘッドレス認証ライブラリです。Laravel の認証機能のフロントエンド実装がすでに完成している場合は、アプリケーションスターターキット を使用するべきです。

Fortify のすべてのビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::registerView(function () {
  8. return view('auth.register');
  9. });
  10. // ...
  11. }

Fortify は、このビューを返す /register ルートを定義することを担当します。register テンプレートには、Fortify によって定義された /register エンドポイントに POST リクエストを送信するフォームを含める必要があります。

/register エンドポイントは、文字列 name、文字列のメールアドレス/ユーザー名、password、および password_confirmation フィールドを期待します。メール/ユーザー名フィールドの名前は、アプリケーションの fortify 設定ファイル内で定義された username 設定値と一致する必要があります。

登録試行が成功した場合、Fortify はアプリケーションの fortify 設定ファイル内の home 設定オプションを介して構成された URI にユーザーをリダイレクトします。リクエストが XHR リクエストであった場合、201 HTTP レスポンスが返されます。

リクエストが成功しなかった場合、ユーザーは登録画面にリダイレクトされ、検証エラーは共有 $errors Blade テンプレート変数を介して利用可能になります。また、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。

登録のカスタマイズ

ユーザーの検証および作成プロセスは、Laravel Fortify をインストールしたときに生成された App\Actions\Fortify\CreateNewUser アクションを変更することでカスタマイズできます。

パスワードリセット

パスワードリセットリンクのリクエスト

アプリケーションのパスワードリセット機能を実装するには、Fortify に「パスワードを忘れた」ビューを返す方法を指示する必要があります。覚えておいてください、Fortify はヘッドレス認証ライブラリです。Laravel の認証機能のフロントエンド実装がすでに完成している場合は、アプリケーションスターターキット を使用するべきです。

Fortify のすべてのビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::requestPasswordResetLinkView(function () {
  8. return view('auth.forgot-password');
  9. });
  10. // ...
  11. }

Fortify は、このビューを返す /forgot-password エンドポイントを定義することを担当します。forgot-password テンプレートには、Fortify によって定義された /forgot-password エンドポイントに POST リクエストを送信するフォームを含める必要があります。

/forgot-password エンドポイントは、文字列 email フィールドを期待します。このフィールド/データベース列の名前は、アプリケーションの fortify 設定ファイル内で定義された email 設定値と一致する必要があります。

パスワードリセットリンクリクエストの応答処理

パスワードリセットリンクリクエストが成功した場合、Fortify はユーザーを /forgot-password エンドポイントにリダイレクトし、ユーザーにパスワードをリセットするために使用できる安全なリンクを含むメールを送信します。リクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。

成功したリクエストの後、/forgot-password エンドポイントにリダイレクトされた後、status セッション変数を使用してパスワードリセットリンクリクエストの試行状況を表示できます。

$status セッション変数の値は、アプリケーションの passwords 言語ファイル 内で定義された翻訳文字列のいずれかと一致します。この値をカスタマイズしたい場合、Laravel の言語ファイルを公開していない場合は、lang:publish Artisan コマンドを介して行うことができます:

  1. @if (session('status'))
  2. <div class="mb-4 font-medium text-sm text-green-600">
  3. {{ session('status') }}
  4. </div>
  5. @endif

リクエストが成功しなかった場合、ユーザーはパスワードリセットリンクリクエスト画面にリダイレクトされ、検証エラーは共有 $errors Blade テンプレート変数を介して利用可能になります。また、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。

パスワードのリセット

アプリケーションのパスワードリセット機能を実装するには、Fortify に「パスワードリセット」ビューを返す方法を指示する必要があります。

Fortify のすべてのビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. use Illuminate\Http\Request;
  3. /**
  4. * Bootstrap any application services.
  5. */
  6. public function boot(): void
  7. {
  8. Fortify::resetPasswordView(function (Request $request) {
  9. return view('auth.reset-password', ['request' => $request]);
  10. });
  11. // ...
  12. }

Fortify は、このビューを表示するルートを定義することを担当します。reset-password テンプレートには、/reset-password に POST リクエストを送信するフォームを含める必要があります。

/reset-password エンドポイントは、文字列 email フィールド、password フィールド、password_confirmation フィールド、および token の値を含む隠しフィールドを期待します。フィールド名「email」は、アプリケーションの email 設定ファイル内で定義された request()->route('token') 設定値と一致する必要があります。

パスワードリセット応答の処理

パスワードリセットリクエストが成功した場合、Fortify は /login ルートにリダイレクトし、ユーザーが新しいパスワードでログインできるようにします。さらに、status セッション変数が設定され、ログイン画面でリセットの成功状況を表示できます:

  1. @if (session('status'))
  2. <div class="mb-4 font-medium text-sm text-green-600">
  3. {{ session('status') }}
  4. </div>
  5. @endif

リクエストが XHR リクエストであった場合、200 HTTP レスポンスが返されます。

リクエストが成功しなかった場合、ユーザーはパスワードリセット画面にリダイレクトされ、検証エラーは共有 $errors Blade テンプレート変数を介して利用可能になります。また、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。

パスワードリセットのカスタマイズ

パスワードリセットプロセスは、Laravel Fortify をインストールしたときに生成された App\Actions\ResetUserPassword アクションを変更することでカスタマイズできます。

メール確認

登録後、ユーザーがアプリケーションにアクセスを続ける前にメールアドレスを確認することを望むかもしれません。始めるには、emailVerification 機能が features 配列の fortify 設定ファイル内で有効になっていることを確認してください。次に、App\Models\User クラスが Illuminate\Contracts\Auth\MustVerifyEmail インターフェースを実装していることを確認してください。

これらの 2 つのセットアップ手順が完了すると、新しく登録されたユーザーは、メールアドレスの所有権を確認するように促すメールを受け取ります。ただし、ユーザーにメールの確認リンクをクリックする必要があることを通知するメール確認画面を Fortify に表示する方法を指示する必要があります。

Fortify のすべてのビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの App\Providers\FortifyServiceProvider クラスの boot メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::verifyEmailView(function () {
  8. return view('auth.verify-email');
  9. });
  10. // ...
  11. }

Fortify は、Laravel の組み込み verified ミドルウェアによってユーザーが /email/verify エンドポイントにリダイレクトされたときにこのビューを表示するルートを定義することを担当します。

verify-email テンプレートには、ユーザーに送信されたメールの確認リンクをクリックするように指示する情報メッセージを含める必要があります。

メール確認リンクの再送信

必要に応じて、アプリケーションの verify-email テンプレートにボタンを追加して、/email/verification-notification エンドポイントに POST リクエストをトリガーできます。このエンドポイントがリクエストを受信すると、新しい確認メールリンクがユーザーにメールされ、以前のリンクが誤って削除されたり失われたりした場合に新しい確認リンクを取得できるようになります。

確認リンクメールの再送信リクエストが成功した場合、Fortify は /email/verify エンドポイントに status セッション変数を持ってユーザーをリダイレクトし、操作が成功したことをユーザーに通知する情報メッセージを表示できるようにします。リクエストが XHR リクエストであった場合、202 HTTP レスポンスが返されます:

  1. @if (session('status') == 'verification-link-sent')
  2. <div class="mb-4 font-medium text-sm text-green-600">
  3. A new email verification link has been emailed to you!
  4. </div>
  5. @endif

ルートの保護

ルートまたはルートグループがユーザーにメールアドレスの確認を要求する必要があることを指定するには、Laravel の組み込み verified ミドルウェアをルートに添付する必要があります。verified ミドルウェアエイリアスは Laravel によって自動的に登録され、Illuminate\Auth\Middleware\EnsureEmailIsVerified ミドルウェアのエイリアスとして機能します:

  1. Route::get('/dashboard', function () {
  2. // ...
  3. })->middleware(['verified']);

パスワード確認

アプリケーションを構築していると、ユーザーにアクションを実行する前にパスワードを確認させる必要がある場合があります。通常、これらのルートはLaravelの組み込みpassword.confirmミドルウェアによって保護されています。

パスワード確認機能を実装するには、Fortifyにアプリケーションの「パスワード確認」ビューを返す方法を指示する必要があります。Fortifyはヘッドレス認証ライブラリであることを忘れないでください。Laravelの認証機能のフロントエンド実装がすでに完成しているものを使用したい場合は、アプリケーションスターターキットを使用するべきです。

Fortify のすべてのビューのレンダリングロジックは、Laravel\Fortify\Fortify クラスを介して利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションの boot クラスの App\Providers\FortifyServiceProvider メソッドから呼び出されるべきです:

  1. use Laravel\Fortify\Fortify;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Fortify::confirmPasswordView(function () {
  8. return view('auth.confirm-password');
  9. });
  10. // ...
  11. }

Fortifyは、このビューを返す/user/confirm-passwordエンドポイントの定義を担当します。あなたのconfirm-passwordテンプレートには、/user/confirm-passwordエンドポイントにPOSTリクエストを送信するフォームが含まれている必要があります。/user/confirm-passwordエンドポイントは、ユーザーの現在のパスワードを含むpasswordフィールドを期待しています。

パスワードがユーザーの現在のパスワードと一致する場合、Fortifyはユーザーをアクセスしようとしていたルートにリダイレクトします。リクエストがXHRリクエストであった場合、201 HTTPレスポンスが返されます。

リクエストが成功しなかった場合、ユーザーはパスワード確認画面にリダイレクトされ、検証エラーは共有$errors Bladeテンプレート変数を介して利用可能になります。また、XHRリクエストの場合、検証エラーは422 HTTPレスポンスと共に返されます。