Skip to content

Laravel Fortify

簡介

Laravel Fortify 是 Laravel 的一個前端無關的認證後端實作。Fortify 註冊了實作所有 Laravel 認證功能所需的路由與控制器,包括登入、註冊、密碼重設、電子郵件驗證等。安裝 Fortify 後,您可以執行 route:list Artisan 命令來查看 Fortify 註冊的路由。

由於 Fortify 不提供自己的使用者介面,它旨在與您自己的使用者介面配對使用,該介面會向 Fortify 註冊的路由發出請求。我們將在本文件的其餘部分詳細討論如何向這些路由發出請求。

📌 備註

請記住,Fortify 是一個旨在讓您在實作 Laravel 認證功能時搶得先機的套件。您並非必須使用它。 您始終可以自由地透過查閱認證密碼重設電子郵件驗證文件來手動與 Laravel 的認證服務互動。

什麼是 Fortify?

如前所述,Laravel Fortify 是 Laravel 的一個前端無關的認證後端實作。Fortify 註冊了實作所有 Laravel 認證功能所需的路由與控制器,包括登入、註冊、密碼重設、電子郵件驗證等。

您並非必須使用 Fortify 才能使用 Laravel 的認證功能。 您始終可以自由地透過查閱認證密碼重設電子郵件驗證文件來手動與 Laravel 的認證服務互動。

如果您是 Laravel 的新手,在嘗試使用 Laravel Fortify 之前,您可能希望探索 Laravel Breeze 應用程式入門套件。Laravel Breeze 為您的應用程式提供了認證鷹架,其中包括使用 Tailwind CSS 建構的使用者介面。與 Fortify 不同,Breeze 將其路由與控制器直接發佈到您的應用程式中。這讓您可以在讓 Laravel Fortify 為您實作這些功能之前,先研究並熟悉 Laravel 的認證功能。

Laravel Fortify 本質上是將 Laravel Breeze 的路由與控制器作為一個不包含使用者介面的套件提供。這讓您仍然可以快速建立應用程式認證層的後端實作,而無需受限於任何特定的前端考量。

何時該使用 Fortify?

您可能想知道何時適合使用 Laravel Fortify。首先,如果您正在使用 Laravel 的某個應用程式入門套件,則無需安裝 Laravel Fortify,因為所有 Laravel 的應用程式入門套件都已經提供了完整的認證實作。

如果您沒有使用應用程式入門套件且您的應用程式需要認證功能,您有兩種選擇:手動實作應用程式的認證功能,或者使用 Laravel Fortify 來提供這些功能的後端實作。

如果您選擇安裝 Fortify,您的使用者介面將向本文件詳述的 Fortify 認證路由發出請求,以便認證與註冊使用者。

如果您選擇手動與 Laravel 的認證服務互動而非使用 Fortify,您可以透過查閱認證密碼重設電子郵件驗證文件來完成。

Laravel Fortify 與 Laravel Sanctum

有些開發者對於 Laravel Sanctum 與 Laravel Fortify 之間的差異感到困惑。因為這兩個套件解決了兩個不同但相關的問題,Laravel Fortify 與 Laravel Sanctum 並非互斥或競爭的套件。

Laravel Sanctum 僅關注管理 API 令牌並使用 Session Cookie 或 Token 認證現有使用者。Sanctum 不提供任何處理使用者註冊、密碼重設等的路由。

如果您正嘗試手動為提供 API 或作為單頁應用程式後端的應用程式建構認證層,那麼您很可能會同時使用 Laravel Fortify (用於使用者註冊、密碼重設等) 與 Laravel Sanctum (API 令牌管理、Session 認證)。

安裝

首先,使用 Composer 套件管理器安裝 Fortify:

shell
composer require laravel/fortify

接著,使用 fortify:install Artisan 命令發佈 Fortify 的資源:

shell
php artisan fortify:install

此命令會將 Fortify 的 Actions 發佈到您的 app/Actions 目錄中,如果該目錄不存在,則會被建立。此外,FortifyServiceProvider、設定檔以及所有必要的資料庫遷移都將被發佈。

接下來,您應該遷移您的資料庫:

shell
php artisan migrate

Fortify 功能

fortify 設定檔包含一個 features 設定陣列。此陣列定義了 Fortify 預設會公開哪些後端路由/功能。如果您沒有將 Fortify 與 Laravel Jetstream 結合使用,我們建議您僅啟用以下功能,這些功能是大多數 Laravel 應用程式提供的基本認證功能:

php
'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
],

停用視圖

預設情況下,Fortify 定義的路由旨在返回視圖,例如登入畫面或註冊畫面。然而,如果您正在建構一個 JavaScript 驅動的單頁應用程式,您可能不需要這些路由。因此,您可以透過將應用程式 config/fortify.php 設定檔中的 views 設定值設為 false 來完全停用這些路由:

php
'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。email / username 欄位的名稱應與應用程式 config/fortify.php 設定檔中的 username 值相符。此外,還可以提供一個布林 remember 欄位,以指示使用者希望使用 Laravel 提供的「記住我」功能。

如果登入嘗試成功,Fortify 將會將您重新導向至應用程式 fortify 設定檔中透過 home 設定選項所配置的 URI。如果登入請求是 XHR 請求,則會回傳 200 HTTP 回應。

如果請求不成功,使用者將會被重新導向回登入畫面,且驗證錯誤將透過共享的 $errors Blade 模板變數 提供給您。或者,如果是 XHR 請求,驗證錯誤將會透過 422 HTTP 回應回傳。

自訂使用者認證

Fortify 會根據提供的憑證以及為您的應用程式配置的認證守衛 (authentication guard) 自動檢索並認證使用者。然而,您有時可能會希望完全自訂登入憑證的認證方式以及使用者的檢索方式。幸運的是,Fortify 允許您使用 Fortify::authenticateUsing 方法輕鬆實現此目的。

此方法接受一個閉包 (closure),該閉包會接收傳入的 HTTP 請求。該閉包負責驗證附加到請求的登入憑證並回傳相關的使用者實例。如果憑證無效或找不到使用者,閉包應回傳 nullfalse。通常,此方法應從您的 FortifyServiceProviderboot 方法中呼叫:

php
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 使用的認證守衛 (authentication guard)。然而,您應該確保配置的守衛是 Illuminate\Contracts\Auth\StatefulGuard 的實作。如果您嘗試使用 Laravel Fortify 來認證單頁應用程式 (SPA),您應該結合 Laravel Sanctum 使用 Laravel 預設的 web 守衛。

自訂認證流程

Laravel Fortify 透過一個可呼叫 (invokable) 類別的流程來認證登入請求。如果您願意,您可以定義一個自訂的類別流程,登入請求應透過該流程進行處理。每個類別都應該有一個 __invoke 方法,該方法接收傳入的 Illuminate\Http\Request 實例,並且,就像 中介層 一樣,一個 $next 變數會被呼叫,以便將請求傳遞給流程中的下一個類別。

要定義您的自訂流程,您可以使用 Fortify::authenticateThrough 方法。此方法接受一個閉包 (closure),該閉包應回傳要將登入請求傳遞的類別陣列。通常,此方法應從應用程式的 App\Providers\FortifyServiceProvider 類別的 boot 方法中呼叫。

以下範例包含預設的流程定義,您可以在進行自己的修改時將其作為起點:

php
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 設定檔中。

📌 備註

結合節流 (throttling)、雙因素認證 和外部網路應用程式防火牆 (WAF),將為您的合法應用程式使用者提供最穩健的防禦。

自訂重導向

如果登入嘗試成功,Fortify 將會將您重新導向至應用程式 fortify 設定檔中透過 home 設定選項所配置的 URI。如果登入請求是 XHR 請求,則會回傳 200 HTTP 回應。使用者登出應用程式後,將會被重新導向至 / URI。

如果您需要對此行為進行進階自訂,您可以將 LoginResponseLogoutResponse 契約 (contracts) 的實作綁定到 Laravel 服務容器 中。通常,這應該在應用程式的 App\Providers\FortifyServiceProvider 類別的 register 方法中完成:

php
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 的雙因素認證功能啟用時,使用者在認證過程中必須輸入一個六位數字的權杖。此權杖是透過時間基礎的一次性密碼 (TOTP) 生成的,可以從任何相容 TOTP 的行動認證應用程式(例如 Google Authenticator)中獲取。

開始之前,您應首先確保應用程式的 App\Models\User 模型使用了 Laravel\Fortify\TwoFactorAuthenticatable Trait:

php
<?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 Session 變數將被設定為 two-factor-authentication-enabled。您可以在範本中偵測此 status Session 變數以顯示適當的成功訊息。如果請求是 XHR 請求,則將返回 200 HTTP 回應。

選擇啟用雙因素認證後,使用者仍必須透過提供有效的雙因素認證碼來「確認」其雙因素認證設定。因此,您的「成功」訊息應告知使用者雙因素認證確認仍然是必需的:

html
@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:

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

如果您正在建構由 JavaScript 驅動的前端,您可以向 /user/two-factor-qr-code 端點發出 XHR GET 請求,以取得使用者的雙因素認證 QR 碼。此端點將返回一個包含 svg 鍵的 JSON 物件。

確認雙因素認證

除了顯示使用者的雙因素認證 QR 碼外,您還應該提供一個文字輸入框,讓使用者輸入有效的認證碼以「確認」其雙因素認證設定。此代碼應透過 POST 請求發送到 Fortify 定義的 /user/confirmed-two-factor-authentication 端點,以提供給 Laravel 應用程式。

如果請求成功,使用者將被重導向回先前的 URL,並且 status Session 變數將被設定為 two-factor-authentication-confirmed

html
@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 來渲染應用程式的前端,您可以透過已認證的使用者實例來存取恢復代碼:

php
(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 方法中呼叫此方法:

php
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 如何回傳我們的「註冊」視圖。請記住,Fortify 是一個無頭認證函式庫。如果你希望獲得一個已為你完成的 Laravel 認證功能前端實作,你應該使用 應用程式入門套件

所有 Fortify 的視圖渲染邏輯都可以透過 Laravel\Fortify\Fortify class 提供的適當方法進行自訂。通常,你應該從應用程式的 App\Providers\FortifyServiceProvider class 的 boot 方法中呼叫此方法:

php
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、字串 email address / username、passwordpassword_confirmation 欄位。email / username 欄位的名稱應與應用程式 fortify 設定檔中定義的 username 設定值相符。

如果註冊嘗試成功,Fortify 會將使用者重導向至應用程式 fortify 設定檔中透過 home 設定選項所設定的 URI。如果該請求是 XHR 請求,則會回傳 201 HTTP 回應。

如果請求不成功,使用者將被重導回註冊畫面,並且驗證錯誤將透過共用的 $errors Blade 模板變數 供你使用。或者,如果是 XHR 請求,驗證錯誤將隨著 422 HTTP 回應一併回傳。

自訂註冊

使用者驗證與建立流程可以透過修改當你安裝 Laravel Fortify 時所產生的 App\Actions\Fortify\CreateNewUser action 來進行自訂。

密碼重設

請求密碼重設連結

為了開始實作應用程式的密碼重設功能,我們需要指示 Fortify 如何回傳我們的「忘記密碼」視圖。請記住,Fortify 是一個無頭認證函式庫。如果你希望獲得一個已為你完成的 Laravel 認證功能前端實作,你應該使用 應用程式入門套件

所有 Fortify 的視圖渲染邏輯都可以透過 Laravel\Fortify\Fortify class 提供的適當方法進行自訂。通常,你應該從應用程式的 App\Providers\FortifyServiceProvider class 的 boot 方法中呼叫此方法:

php
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 Session 變數可以用來顯示密碼重設連結請求嘗試的狀態。

$status Session 變數的值將與你的應用程式 passwords 語系檔 中定義的其中一個翻譯字串相符。如果你想自訂此值且尚未發布 Laravel 的語系檔,你可以透過 lang:publish Artisan 命令來完成:

html
@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 class 提供的適當方法進行自訂。通常,你應該從應用程式的 App\Providers\FortifyServiceProvider class 的 boot 方法中呼叫此方法:

php
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 欄位,以及一個名為 token 的隱藏欄位,該欄位包含 request()->route('token') 的值。「email」欄位/資料庫欄位的名稱應與應用程式 fortify 設定檔中定義的 email 設定值相符。

處理密碼重設回應

如果密碼重設請求成功,Fortify 會將使用者重導回 /login 路由,以便使用者可以使用他們的新密碼登入。此外,還會設定一個 status Session 變數,以便你可以在登入畫面顯示重設成功的狀態:

blade
@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 action 來進行自訂。

電子郵件驗證

註冊後,您可能會希望使用者在繼續存取應用程式之前驗證其電子郵件地址。首先,請確保您 fortify 設定檔中的 features 陣列已啟用 emailVerification 功能。接著,您應該確保您的 App\Models\User 類別實作了 Illuminate\Contracts\Auth\MustVerifyEmail 介面。

完成這兩個設定步驟後,新註冊的使用者將會收到一封電子郵件,提示他們驗證電子郵件地址的所有權。然而,我們需要告知 Fortify 如何顯示電子郵件驗證畫面,該畫面會通知使用者他們需要點擊電子郵件中的驗證連結。

Fortify 所有視圖的渲染邏輯都可以透過 Laravel\Fortify\Fortify 類別提供的適當方法進行自訂。通常,您應該從應用程式的 App\Providers\FortifyServiceProvider 類別的 boot 方法中呼叫此方法:

php
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 會負責定義顯示此視圖的路由。

您的 verify-email 模板應該包含一條資訊訊息,指示使用者點擊發送到他們電子郵件地址的電子郵件驗證連結。

重新發送電子郵件驗證連結

如果您願意,您可以在應用程式的 verify-email 模板中添加一個按鈕,觸發對 /email/verification-notification 端點的 POST 請求。當此端點收到請求時,新的驗證電子郵件連結將會發送給使用者,讓使用者在先前的連結被意外刪除或遺失時,能夠取得新的驗證連結。

如果重新發送驗證連結電子郵件的請求成功,Fortify 將會使用 status session 變數將使用者重導向回 /email/verify 端點,讓您可以向使用者顯示一條資訊訊息,告知他們操作已成功。如果請求是 XHR 請求,則會傳回 202 HTTP 回應:

blade
@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 中介層的別名:

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

密碼確認

在建構您的應用程式時,您偶爾可能會遇到某些動作需要使用者在執行前確認其密碼。通常,這些路由受 Laravel 內建的 password.confirm 中介層保護。

要開始實作密碼確認功能,我們需要指示 Fortify 如何傳回我們應用程式的「密碼確認」視圖。請記住,Fortify 是一個無頭(headless)認證函式庫。如果您想要一個已完成的 Laravel 認證功能前端實作,您應該使用 應用程式入門套件

Fortify 所有視圖的渲染邏輯都可以透過 Laravel\Fortify\Fortify 類別提供的適當方法進行自訂。通常,您應該從應用程式的 App\Providers\FortifyServiceProvider 類別的 boot 方法中呼叫此方法:

php
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 回應傳回。