コンテンツへスキップ

Laravel Fortify

イントロダクション

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

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

FortifyはLaravelの認証機能の実装を始めるためのパッケージであることを覚えておいてください。使用は必須ではありません。 認証パスワードリセットメール検証のドキュメントに従い、Laravelの認証サービスを手動で操作することもいつでも可能です。

Fortifyとは?

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

Laravelの認証機能を使用するためにFortifyを使用する必要はありません。 認証パスワードリセットメール検証のドキュメントに従い、Laravelの認証サービスを手動で操作することもいつでも可能です。

Laravelを初めて使用する場合は、Laravel Fortifyを使用する前に、アプリケーションスターターキットを試してみることをお勧めします。スターターキットは、Tailwind CSSで構築されたユーザーインターフェイスを含む、アプリケーションの認証基盤を提供します。これにより、Laravel Fortifyにこれらの機能の実装を任せる前に、Laravelの認証機能について学習し、慣れることができます。

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

いつFortifyを使用すべきか?

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

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

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

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

Laravel FortifyとLaravel Sanctum

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

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

APIを提供したり、シングルページアプリケーションのバックエンドとして機能するアプリケーションの認証レイヤーを手動で構築しようとしている場合、Laravel Fortify(ユーザー登録、パスワードリセットなど)とLaravel Sanctum(APIトークン管理、セッション認証)の両方を利用する可能性は十分にあります。

インストール

まず、Composerパッケージマネージャを使用してFortifyをインストールします。

1composer require laravel/fortify

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

1php artisan fortify:install

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

次に、データベースをマイグレートする必要があります。

1php artisan migrate

Fortifyの機能

fortify設定ファイルには、features設定配列が含まれています。この配列は、Fortifyがデフォルトで公開するバックエンドのルート/機能を定義します。ほとんどの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ルートの定義を処理します。

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

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

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

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

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

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

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

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

認証ガード

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

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

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

カスタムパイプラインを定義するには、Fortify::authenticateThroughメソッドを使用できます。このメソッドは、ログインリクエストをパイプするクラスの配列を返すクロージャを受け取ります。通常、このメソッドはApp\Providers\FortifyServiceProviderクラスのbootメソッドから呼び出す必要があります。

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

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

認証のスロットリング

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

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

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

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

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

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

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

二要素認証

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

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

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

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

デフォルトでは、fortify設定ファイルのfeatures配列は、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メソッドから呼び出す必要があります。

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

Fortifyは、このビューを返す/two-factor-challengeルートの定義を処理します。two-factor-challengeテンプレートには、/two-factor-challengeエンドポイントにPOSTリクエストを送信するフォームを含める必要があります。/two-factor-challengeアクションは、有効なTOTPトークンを含むcodeフィールド、またはユーザーのリカバリーコードの1つを含む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メソッドから呼び出す必要があります。

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

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メソッドから呼び出す必要があります。

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

Fortifyは、このビューを返す/forgot-passwordエンドポイントの定義を処理します。forgot-passwordテンプレートには、/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メソッドから呼び出す必要があります。

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

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

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

パスワードリセットのレスポンスの処理

パスワードリセットリクエストが成功した場合、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アクションを変更することでカスタマイズできます。

メール認証

登録後、ユーザーがアプリケーションへのアクセスを続ける前にメールアドレスを検証するようにしたい場合があります。まず、fortify設定ファイルのfeatures配列でemailVerification機能が有効になっていることを確認します。次に、App\Models\UserクラスがIlluminate\Contracts\Auth\MustVerifyEmailインターフェースを実装していることを確認する必要があります。

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

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

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

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ミドルウェアのエイリアスとして機能します。

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

パスワードの確認

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

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

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

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

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

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

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

Laravelは最も生産的な方法です
ソフトウェアを構築、デプロイ、監視します。