Laravel 8.x Laravel Fortify

イントロダクション

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

Fortifyは独自のユーザーインターフェイスを提供しません。つまり、登録したルートにリクエストを送信する皆さん自身の​​のユーザーインターフェイスと組み合わせることを目的としています。このドキュメントの残りの部分で、こうしたルートにリクエストを送信する方法について正確に説明します。

Tip!! 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を使用すべきか?

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

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

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

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

php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

このコマンドは、Fortifyのアクションをapp/Actionsディレクトリにリソース公開します。ディレクトリが存在しない場合は作成します。さらに、Fortifyの構成ファイルとマイグレーションもリソース公開されます。

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

php artisan migrate

Fortifyサービスプロバイダ

上で説明したvendor:publishコマンドは、App\Providers\FortifyServiceProviderクラスもリソース公開します。このクラスが、アプリケーションのconfig/app.php構成ファイルのproviders配列内に登録されていることを確認する必要があります。

Fortifyサービスプロバイダは、Fortifyが公開したアクションを登録し、それぞれのタスクがFortifyによって実行されるときに各アクションを使用するようにFortifyに指示しています。

Fortifyの機能

fortify設定ファイルには、features設定配列が含まれています。この配列は、Fortifyがデフォルトで公開するバックエンドルート/機能を定義しています。FortifyをLaravel Jetstream和文)と組み合わせて使用​​していない場合は、ほとんどの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;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    Fortify::loginView(function () {
        return view('auth.login');
    });

    // ...
}

ログインテンプレートには、/loginへのPOSTリクエストを行うフォームが含まれている必要があります。/loginエンドポイントは、文字列のメール/ユーザー名とパスワード(password)を想定しています。 メール/ユーザー名フィールドの名前は、config/fortify.php設定ファイル内のusername値に一致する必要があります。さらに、論理値のrememberフィールドを提供して、Laravelの提供する継続ログイン(rememberme)機能をユーザーが使用することを指定可能にできます。

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

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

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

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

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

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    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を確実に実装してください。Laravel Fortifyを使用してSPAを認証しようとしている場合は、LaravelのデフォルトのwebガードとLaravel Sanctumを組み合わせて使用​​する必要があります。

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

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

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

以下で、独自の変更を加える場合の参考として使用できる、デフォルトのパイプライン定義例を紹介します。

use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;

Fortify::authenticateThrough(function (Request $request) {
    return array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
    ]);
});

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

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

この動作を高度にカスタマイズする必要がある場合は、LoginResponseLogoutResponse契約の実装をLaravelのサービスコンテナに結合します。通常、これはアプリケーションのApp\Providers\FortifyServiceProviderクラスのregisterメソッド内で行います。

use Laravel\Fortify\Contracts\LogoutResponse;

/**
 * アプリケーションの全サービスの登録
 *
 * @return void
 */
public function register()
{
    $this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
        public function toResponse($request)
        {
            return redirect('/');
        }
    });
}

2要素認証

Fortifyの2要素認証機能を有効にしている場合、ユーザーは認証プロセス中に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;
}

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

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

2要素認証の有効化

2要素認証を有効にするには、アプリケーションは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 text-green-600">
        Two factor authentication has been enabled.
    </div>
@endif

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

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

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

リカバリコードの表示

また、ユーザーの2要素リカバリコードも表示する必要があります。これらのリカバリコードにより、ユーザーはモバイルデバイスにアクセスできなくなった場合にも認証できます。Bladeを使用してアプリケーションのフロントエンドをレンダリングしている場合は、認証済みのユーザーインスタンスを介してリカバリコードにアクセスできます。

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

JavaScriptを利用したフロントエンドを構築している場合は、/user/two-factor-recovery-codesエンドポイントに対してXHRのGETリクエストを行ってください。このエンドポイントは、ユーザーのリカバリコードを含むJSON配列を返します。

ユーザーのリカバリコードを再生成するとき、アプリケーションは/user/two-factor-recovery-codesエンドポイントに対してPOSTリクエストを行う必要があります。

2要素認証による認証

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

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

use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    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フィールドまたはユーザーのリカバリコードの1つを含むrecovery_codeフィールドを期待します。

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

リクエストが成功しなかった場合、ユーザーは2要素認証画面へリダイレクトされ、バリデーションエラーは共有の$errors Bladeテンプレート変数により利用できます。XHRリクエストの場合、バリデーションエラーは422 HTTPレスポンスで返されます。

2要素認証の無効化

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

ユーザー登録

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

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

use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    Fortify::registerView(function () {
        return view('auth.register');
    });

    // ...
}

Fortifyは、このビューを返す/registerルートの定義を処理します。registerテンプレートには、Fortifyが定義した/registerエンドポイントへPOSTリクエストを行うフォームが含まれている必要があります。

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

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

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

ユーザー登録のカスタマイズ

ユーザーのバリデーションと作成のプロセスは、Laravel Fortifyのインストール時に生成されるApp\Actions\Fortify\CreateNewUserアクションを変更すればカスタマイズできます。

パスワードリセット

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

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

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

use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    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セッション変数を使用して、パスワードリセットリンクリクエストの実行ステータスを表示できます。このセッション変数の値は、アプリケーションのpasswords言語ファイル内で定義されている翻訳文字列の1つと一致します。

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

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

パスワードのリセット

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

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

use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    Fortify::resetPasswordView(function ($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;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    Fortify::verifyEmailView(function () {
        return view('auth.verify-email');
    });

    // ...
}

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

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ミドルウェアをルートに指定する必要があります。このミドルウェアは、アプリケーションのApp\Http\Kernelクラスで登録されています。

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

パスワードの確認

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

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

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

use Laravel\Fortify\Fortify;

/**
 * 全アプリケーションサービスの起動処理
 *
 * @return void
 */
public function boot()
{
    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レスポンスが返されます。

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

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる