跳至內容

Laravel Fortify

簡介

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

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

lightbulb

請記住,Fortify 是一個旨在讓您在實作 Laravel 的身份驗證功能時能有一個良好開端的套件。您並非必須使用它。您可以隨時透過遵循 身份驗證密碼重設電子郵件驗證 文件中提供的文件,手動與 Laravel 的身份驗證服務互動。

什麼是 Fortify?

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

您並非必須使用 Fortify 才能使用 Laravel 的身份驗證功能。您可以隨時透過遵循 身份驗證密碼重設電子郵件驗證 文件中提供的文件,手動與 Laravel 的身份驗證服務互動。

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

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 或權杖驗證現有使用者。Sanctum 不提供任何處理使用者註冊、密碼重設等的路由。

如果您嘗試為提供 API 或作為單頁應用程式後端的應用程式手動建立身份驗證層,則完全有可能同時使用 Laravel Fortify(用於使用者註冊、密碼重設等)和 Laravel Sanctum(API 權杖管理、Session 身份驗證)。

安裝

若要開始使用,請使用 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 預設會公開哪些後端路由/功能。如果您未使用 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;
 
/**
* 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 會根據提供的憑證和應用程式設定的驗證守衛,自動檢索並驗證使用者。然而,您有時可能希望完全自訂驗證登入憑證和檢索使用者的過程。幸運的是,Fortify 允許您使用 Fortify::authenticateUsing 方法輕鬆實現此目的。

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

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 的實作。如果您嘗試使用 Laravel Fortify 來驗證 SPA,則應將 Laravel 的預設 web 守衛與 Laravel Sanctum 結合使用。

自訂身份驗證管道

Laravel Fortify 通過一系列可調用類別的管道來驗證登入請求。如果需要,您可以定義一個自訂類別管道,登入請求應通過該管道傳遞。每個類別都應具有一個 __invoke 方法,該方法會接收傳入的 Illuminate\Http\Request 實例,並且像 中介層一樣,一個 $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 設定檔中。

lightbulb

結合使用節流、雙重驗證和外部 Web 應用程式防火牆 (WAF),將為您的合法應用程式使用者提供最強大的防禦。

自訂重新導向

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

如果您需要對此行為進行進階自訂,您可以將 LoginResponseLogoutResponse 合約的實作繫結到 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 的雙重驗證功能後,使用者需要在驗證過程中輸入一個六位數的數字代碼。此代碼是使用基於時間的一次性密碼 (TOTP) 產生的,可以從任何與 TOTP 相容的行動驗證應用程式(例如 Google Authenticator)中檢索。

在開始之前,您應首先確保應用程式的 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 如何回傳我們的雙重驗證挑戰檢視。可以使用 Laravel\Fortify\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 動作預期會有一個 code 欄位,其中包含有效的 TOTP 代碼,或一個 recovery_code 欄位,其中包含使用者的一個恢復代碼。

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

如果請求不成功,使用者將會被重新導向回雙重驗證挑戰畫面,並且驗證錯誤將會透過共用的 $errors Blade 樣板變數提供給您。或者,在 XHR 請求的情況下,驗證錯誤將會以 422 HTTP 回應回傳。

停用雙重驗證

若要停用雙重驗證,您的應用程式應向 /user/two-factor-authentication 端點發出 DELETE 請求。請記住,Fortify 的雙重驗證端點在呼叫之前需要密碼確認

註冊

若要開始實作應用程式的註冊功能,我們需要指示 Fortify 如何回傳我們的「註冊」檢視。請記住,Fortify 是一個無頭驗證程式庫。如果您想要已經為您完成的 Laravel 驗證功能的前端實作,則應使用應用程式入門套件

可以使用 Laravel\Fortify\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 字串、電子郵件地址/使用者名稱字串、passwordpassword_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 session 變數來顯示密碼重設連結請求嘗試的狀態。

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

處理密碼重設的回應

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

@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 介面。

完成這兩個設定步驟後,新註冊的使用者將會收到一封電子郵件,提示他們驗證他們的電子郵件地址所有權。但是,我們需要告知 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');
});
 
// ...
}

Fortify 將負責定義當使用者被 Laravel 的內建 verified 中介軟體重新導向至 /email/verify 端點時,顯示此檢視畫面的路由。

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

如果您希望,可以在您的應用程式的 verify-email 樣板中新增一個按鈕,該按鈕會觸發向 /email/verification-notification 端點發送 POST 請求。當此端點收到請求時,將會向使用者發送新的驗證電子郵件連結,允許使用者在先前連結被意外刪除或遺失時取得新的驗證連結。

如果重新發送驗證連結電子郵件的請求成功,Fortify 會將使用者重新導向回 /email/verify 端點,並帶有 status session 變數,讓您可以向使用者顯示一則資訊性訊息,告知他們操作成功。如果請求是 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 回應返回。