Laravel Fortify
はじめに
Laravel Fortify は、Laravelのためのフロントエンドに依存しない認証バックエンド実装です。 Fortifyは、ログイン、登録、パスワードリセット、メール認証など、Laravelのすべての認証機能を実装するために必要なルートとコントローラーを登録します。 Fortifyをインストールした後、`route:list` Artisanコマンドを実行して、Fortifyが登録したルートを確認できます。
Fortifyは独自のユーザーインターフェースを提供しないため、Fortifyが登録したルートにリクエストを行う独自のユーザーインターフェースと組み合わせて使用することを意図しています。 このドキュメントの残りの部分では、これらのルートにリクエストを行う方法について詳しく説明します。
Fortifyは、Laravelの認証機能の実装をすぐに開始できるようにするためのパッケージであることに注意してください。 **Fortifyを使用する必要はありません。** 認証、パスワードリセット、メール認証 のドキュメントに記載されている手順に従って、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つのパッケージは、2つの異なるが関連する問題を解決するため、Laravel FortifyとLaravel Sanctumは相互に排他的または競合するパッケージではありません。
Laravel Sanctumは、APIトークンの管理と、セッションCookieまたはトークンを使用した既存のユーザーの認証のみを扱います。 Sanctumは、ユーザー登録、パスワードリセットなどを処理するルートを提供しません。
APIを提供するアプリケーションまたはシングルページアプリケーションのバックエンドとして機能するアプリケーションの認証レイヤーを手動で構築しようとしている場合、Laravel Fortify(ユーザー登録、パスワードリセットなど)とLaravel Sanctum(APIトークン管理、セッション認証)の両方を利用する可能性が十分にあります。
インストール
開始するには、Composerパッケージマネージャーを使用してFortifyをインストールします。
composer require laravel/fortify
次に、`fortify:install` Artisanコマンドを使用してFortifyのリソースを公開します。
php artisan fortify:install
このコマンドは、Fortifyのアクションを`app/Actions`ディレクトリに公開します。このディレクトリは、存在しない場合は作成されます。 さらに、`FortifyServiceProvider`、設定ファイル、および必要なすべてのデータベースマイグレーションが公開されます。
次に、データベースをマイグレートする必要があります。
php artisan migrate
Fortifyの機能
`fortify`設定ファイルには、`features`設定配列が含まれています。 この配列は、Fortifyがデフォルトで公開するバックエンドルート/機能を定義します。 Laravel Jetstream と組み合わせてFortifyを使用していない場合は、ほとんどのLaravelアプリケーションで提供されている基本的な認証機能である、次の機能のみを有効にすることをお勧めします。
'features' => [ Features::registration(), Features::resetPasswords(), Features::emailVerification(),],
ビューの無効化
デフォルトでは、Fortifyはログイン画面や登録画面などのビューを返すことを意図したルートを定義します。 ただし、JavaScript駆動のシングルページアプリケーションを構築している場合は、これらのルートが不要な場合があります。 そのため、アプリケーションの`config/fortify.php`設定ファイル内の`views`設定値を`false`に設定することで、これらのルートを完全に無効にすることができます。
'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
ルートの定義を処理します。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::loginView(function () { return view('auth.login'); }); // ...}
ログインテンプレートには、/login
に POST リクエストを行うフォームを含める必要があります。/login
エンドポイントは、文字列 email
/ username
と password
を予期します。メール / ユーザー名フィールドの名前は、config/fortify.php
設定ファイル内の username
値と一致する必要があります。さらに、ブール値の remember
フィールドを提供して、ユーザーが Laravel によって提供される「記憶する」機能を使用したいことを示すことができます。
ログイン試行が成功した場合、Fortify はアプリケーションの fortify
設定ファイル内の home
設定オプションで設定された URI にリダイレクトします。ログインリクエストが XHR リクエストだった場合、200 HTTP レスポンスが返されます。
リクエストが成功しなかった場合、ユーザーはログイン画面にリダイレクトされ、検証エラーは共有 $errors
Blade テンプレート変数 を介して利用できます。または、XHR リクエストの場合、検証エラーは 422 HTTP レスポンスと共に返されます。
ユーザー認証のカスタマイズ
Fortify は、提供された資格情報とアプリケーションに設定されている認証ガードに基づいて、ユーザーを自動的に取得して認証します。ただし、ログイン資格情報の認証方法とユーザーの取得方法を完全にカスタマイズしたい場合もあります。幸いなことに、Fortify を使用すると、Fortify::authenticateUsing
メソッドを使用してこれを簡単に実現できます。
このメソッドは、受信 HTTP リクエストを受け取るクロージャを受け入れます。クロージャは、リクエストに添付されたログイン資格情報を検証し、関連付けられたユーザーインスタンスを返す役割を担います。資格情報が無効であるか、ユーザーが見つからない場合は、クロージャによって null
または false
が返される必要があります。通常、このメソッドは FortifyServiceProvider
の boot
メソッドから呼び出す必要があります。
use App\Models\User;use Illuminate\Http\Request;use Illuminate\Support\Facades\Hash;use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::authenticateUsing(function (Request $request) { $user = User::where('email', $request->email)->first(); if ($user && Hash::check($request->password, $user->password)) { return $user; } }); // ...}
認証ガード
アプリケーションの fortify
設定ファイル内で、Fortify が使用する認証ガードをカスタマイズできます。ただし、設定されたガードが Illuminate\Contracts\Auth\StatefulGuard
の実装であることを確認する必要があります。SPA を認証するために Laravel Fortify を使用しようとしている場合は、Laravel Sanctum と組み合わせて Laravel のデフォルトの web
ガードを使用する必要があります。
認証パイプラインのカスタマイズ
Laravel Fortify は、呼び出し可能なクラスのパイプラインを介してログインリクエストを認証します。必要に応じて、ログインリクエストがパイプラインされるクラスのカスタムパイプラインを定義できます。各クラスには、受信 Illuminate\Http\Request
インスタンスを受け取る __invoke
メソッドと、ミドルウェア と同様に、リクエストをパイプラインの次のクラスに渡すために呼び出される $next
変数が必要です。
カスタムパイプラインを定義するには、Fortify::authenticateThrough
メソッドを使用できます。このメソッドは、ログインリクエストをパイプラインするクラスの配列を返すクロージャを受け入れます。通常、このメソッドは App\Providers\FortifyServiceProvider
クラスの boot
メソッドから呼び出す必要があります。
以下の例には、独自の変更を行う際の開始点として使用できるデフォルトのパイプライン定義が含まれています。
use Laravel\Fortify\Actions\AttemptToAuthenticate;use Laravel\Fortify\Actions\CanonicalizeUsername;use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;use Laravel\Fortify\Actions\PrepareAuthenticatedSession;use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;use Laravel\Fortify\Features;use Laravel\Fortify\Fortify;use Illuminate\Http\Request; Fortify::authenticateThrough(function (Request $request) { return array_filter([ config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class, config('fortify.lowercase_usernames') ? CanonicalizeUsername::class : null, Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null, AttemptToAuthenticate::class, PrepareAuthenticatedSession::class, ]);});
認証スロットリング
デフォルトでは、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
メソッド内で行う必要があります。
use Laravel\Fortify\Contracts\LogoutResponse; /** * Register any application services. */public function register(): void{ $this->app->instance(LogoutResponse::class, new class implements LogoutResponse { public function toResponse($request) { return redirect('/'); } });}
二要素認証
Fortify の二要素認証機能が有効になっている場合、ユーザーは認証プロセス中に 6 桁の数字トークンを入力する必要があります。このトークンは、Google Authenticator などの TOTP 互換モバイル認証アプリケーションから取得できる時間ベースのワンタイムパスワード (TOTP) を使用して生成されます。
始める前に、まずアプリケーションの App\Models\User
モデルが Laravel\Fortify\TwoFactorAuthenticatable
トレイトを使用していることを確認する必要があります。
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Laravel\Fortify\TwoFactorAuthenticatable; class User extends Authenticatable{ use Notifiable, TwoFactorAuthenticatable;}
次に、ユーザーが二要素認証設定を管理できる画面をアプリケーション内に構築する必要があります。この画面では、ユーザーは二要素認証を有効および無効にしたり、二要素認証リカバリーコードを再生成したりできます。
デフォルトでは、
fortify
設定ファイルのfeatures
配列は、Fortify の二要素認証設定で変更前にパスワードの確認を要求するように指示します。したがって、アプリケーションは続行する前に Fortify の パスワード確認 機能を実装する必要があります。
二要素認証の有効化
二要素認証の有効化を開始するには、アプリケーションは Fortify によって定義された /user/two-factor-authentication
エンドポイントに POST リクエストを行う必要があります。リクエストが成功した場合、ユーザーは前の URL にリダイレクトされ、status
セッション変数が two-factor-authentication-enabled
に設定されます。テンプレート内でこの status
セッション変数を検出して、適切な成功メッセージを表示できます。リクエストが XHR リクエストだった場合、200
HTTP レスポンスが返されます。
二要素認証を有効にすることを選択した後、ユーザーはまだ有効な二要素認証コードを提供することによって二要素認証設定を「確認」する必要があります。そのため、「成功」メッセージには、二要素認証の確認がまだ必要であることをユーザーに指示する必要があります。
@if (session('status') == 'two-factor-authentication-enabled') <div class="mb-4 font-medium text-sm"> Please finish configuring two factor authentication below. </div>@endif
次に、ユーザーが認証アプリケーションにスキャンするための二要素認証 QR コードを表示する必要があります。Blade を使用してアプリケーションのフロントエンドをレンダリングしている場合は、ユーザーインスタンスで利用可能な twoFactorQrCodeSvg
メソッドを使用して QR コード SVG を取得できます。
$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
に設定されます。
@if (session('status') == 'two-factor-authentication-confirmed') <div class="mb-4 font-medium text-sm"> Two factor authentication confirmed and enabled successfully. </div>@endif
二要素認証確認エンドポイントへのリクエストが XHR リクエストを介して行われた場合、200
HTTP レスポンスが返されます。
リカバリーコードの表示
また、ユーザーの二要素リカバリーコードも表示する必要があります。これらのリカバリーコードを使用すると、ユーザーはモバイルデバイスへのアクセスを失った場合に認証できます。Blade を使用してアプリケーションのフロントエンドをレンダリングしている場合は、認証済みユーザーインスタンスを介してリカバリーコードにアクセスできます。
(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
メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::twoFactorChallengeView(function () { return view('auth.two-factor-challenge'); }); // ...}
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に「register」ビューを返す方法を指示する必要があります。Fortifyはヘッドレス認証ライブラリであることを忘れないでください。Laravelの認証機能のフロントエンド実装が既に完了しているものを使用したい場合は、アプリケーションスターターキットを使用する必要があります。
Fortifyのすべてのビューレンダリングロジックは、Laravel\Fortify\Fortify
クラスで利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはApp\Providers\FortifyServiceProvider
クラスのboot
メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::registerView(function () { return view('auth.register'); }); // ...}
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
メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::requestPasswordResetLinkView(function () { return view('auth.forgot-password'); }); // ...}
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コマンドを使用して公開できます。
@if (session('status')) <div class="mb-4 font-medium text-sm text-green-600"> {{ session('status') }} </div>@endif
リクエストが成功しなかった場合、ユーザーはパスワードリセットリンクのリクエスト画面にリダイレクトされ、検証エラーは共有$errors
Bladeテンプレート変数を介して利用できます。または、XHRリクエストの場合、検証エラーは422 HTTPレスポンスとともに返されます。
パスワードのリセット
アプリケーションのパスワードリセット機能の実装を完了するには、Fortifyに「パスワードリセット」ビューを返す方法を指示する必要があります。
Fortifyのすべてのビューレンダリングロジックは、Laravel\Fortify\Fortify
クラスで利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションのApp\Providers\FortifyServiceProvider
クラスのboot
メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify;use Illuminate\Http\Request; /** * Bootstrap any application services. */public function boot(): void{ Fortify::resetPasswordView(function (Request $request) { return view('auth.reset-password', ['request' => $request]); }); // ...}
Fortifyは、このビューを表示するためのルートの定義を処理します。reset-password
テンプレートには、/reset-password
へのPOSTリクエストを行うフォームを含める必要があります。
/reset-password
エンドポイントは、文字列email
フィールド、password
フィールド、password_confirmation
フィールド、およびrequest()->route('token')
の値を含むtoken
という名前の隠しフィールドを予期します。「email」フィールド/データベース列の名前は、アプリケーションのfortify
設定ファイル内で定義されているemail
設定値と一致する必要があります。
パスワードリセットレスポンスの処理
パスワードリセットリクエストが成功した場合、Fortifyはユーザーが新しいパスワードでログインできるように/login
ルートにリダイレクトします。さらに、ログイン画面にリセットの成功ステータスを表示できるように、status
セッション変数が設定されます。
@if (session('status')) <div class="mb-4 font-medium text-sm text-green-600"> {{ session('status') }} </div>@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`メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::verifyEmailView(function () { return view('auth.verify-email'); }); // ...}
Laravelの組み込み`verified`ミドルウェアによってユーザーが`/email/verify`エンドポイントにリダイレクトされると、Fortifyはこのビューを表示するルートの定義を処理します。 p>
`verify-email`テンプレートには、送信されたメールアドレスのメール確認リンクをクリックするようにユーザーに指示する情報メッセージを含める必要があります。
メール確認リンクの再送信
必要に応じて、アプリケーションの`verify-email`テンプレートに、`/ email / verification-notification`エンドポイントへのPOSTリクエストをトリガーするボタンを追加できます。このエンドポイントがリクエストを受信すると、新しい確認メールリンクがユーザーにメールで送信され、ユーザーは前のリンクが誤って削除または紛失した場合に新しい確認リンクを取得できます。
確認リンクメールの再送信リクエストが成功した場合、Fortifyは`status`セッション変数を使用してユーザーを`/ email / verify`エンドポイントにリダイレクトし、操作が成功したことをユーザーに知らせる情報メッセージを表示できるようにします。リクエストがXHRリクエストの場合、202 HTTPレスポンスが返されます。
@if (session('status') == 'verification-link-sent') <div class="mb-4 font-medium text-sm text-green-600"> A new email verification link has been emailed to you! </div>@endif
ルートの保護
ルートまたはルートのグループでユーザーがメールアドレスを確認する必要があることを指定するには、Laravelの組み込み`verified`ミドルウェアをルートに添付する必要があります。 `verified`ミドルウェアエイリアスはLaravelによって自動的に登録され、`Illuminate \ Auth \ Middleware \ EnsureEmailIsVerified`ミドルウェアのエイリアスとして機能します
Route::get('/dashboard', function () { // ...})->middleware(['verified']);
パスワードの確認
アプリケーションの構築中に、アクションを実行する前にユーザーにパスワードの確認を要求する必要があるアクションが時折発生する可能性があります。通常、これらのルートはLaravelの組み込み`password.confirm`ミドルウェアによって保護されています。
パスワード確認機能の実装を開始するには、Fortifyにアプリケーションの「パスワード確認」ビューを返す方法を指示する必要があります。Fortifyはヘッドレス認証ライブラリであることを忘れないでください。 Laravelの認証機能のフロントエンド実装が既に完了しているものを使用したい場合は、アプリケーションスターターキットを使用する必要があります。
Fortifyのすべてのビューレンダリングロジックは、Laravel\Fortify\Fortify
クラスで利用可能な適切なメソッドを使用してカスタマイズできます。通常、このメソッドはアプリケーションのApp\Providers\FortifyServiceProvider
クラスのboot
メソッドから呼び出す必要があります。
use Laravel\Fortify\Fortify; /** * Bootstrap any application services. */public function boot(): void{ Fortify::confirmPasswordView(function () { return view('auth.confirm-password'); }); // ...}
Fortifyは、このビューを返す`/ user / confirm-password`エンドポイントの定義を処理します。 `confirm-password`テンプレートには、`/ user / confirm-password`エンドポイントへのPOSTリクエストを行うフォームを含める必要があります。 `/ user / confirm-password`エンドポイントは、ユーザーの現在のパスワードを含む`password`フィールドを予期します。
パスワードがユーザーの現在のパスワードと一致する場合、Fortifyはユーザーをアクセスしようとしていたルートにリダイレクトします。リクエストがXHRリクエストの場合、201 HTTPレスポンスが返されます。
リクエストが成功しなかった場合、ユーザーはパスワード確認画面にリダイレクトされ、検証エラーは共有`$ errors` Bladeテンプレート変数を介して利用できます。または、XHRリクエストの場合、検証エラーは422 HTTPレスポンスとともに返されます。