Laravel Fortify
簡介
Laravel Fortify 是一個針對 Laravel 的無前端(frontend agnostic)認證後端實現。Fortify 註冊了實現 Laravel 所有認證功能所需的路由和控制器,包括登入、註冊、密碼重置、郵箱驗證等。安裝 Fortify 後,你可以執行 route:list Artisan 命令檢視 Fortify 註冊的路由。
由於 Fortify 不提供自己的使用者介面,它旨在與你自己的使用者介面配對使用,由你的介面向其註冊的路由發起請求。我們將在本篇文件的後續內容中詳細討論如何向這些路由發起請求。
什麼是 Fortify?
如前所述,Laravel Fortify 是一個針對 Laravel 的無前端認證後端實現。Fortify 註冊了實現 Laravel 所有認證功能所需的路由和控制器,包括登入、註冊、密碼重置、郵箱驗證等。
為了使用 Laravel 的認證功能,你無需強制使用 Fortify。你始終可以按照認證、密碼重置和郵箱驗證文件中的說明,手動與 Laravel 的認證服務進行互動。
如果你是 Laravel 的新手,可能需要探索我們的應用入門套件。Laravel 的應用入門套件在內部使用了 Fortify,為你的應用提供了包含由 Tailwind CSS 構建的使用者介面的認證腳手架。這使你可以學習並熟悉 Laravel 的認證功能。
Laravel Fortify 本質上提取了我們應用入門套件中的路由和控制器,並將其作為一個不包含使用者介面的軟體包提供。這使你依然可以快速構建應用認證層的後端實現,而無需繫結到任何特定的前端方案。
我應該何時使用 Fortify?
你可能想知道何時適合使用 Laravel Fortify。首先,如果你正在使用 Laravel 的應用入門套件,則無需安裝 Laravel Fortify,因為所有 Laravel 的應用入門套件都已經使用了 Fortify 並提供了完整的認證實現。
如果你沒有使用應用入門套件,且你的應用需要認證功能,你有兩個選擇:手動實現應用的認證功能,或使用 Laravel Fortify 提供這些功能的後端實現。
如果你選擇安裝 Fortify,你的使用者介面將向本篇文件中詳述的 Fortify 認證路由發起請求,以實現使用者認證和註冊。
如果你選擇手動與 Laravel 的認證服務互動而不使用 Fortify,可以參考認證、密碼重置和郵箱驗證文件中的說明來完成。
Laravel Fortify 與 Laravel Sanctum
一些開發者對於 Laravel Sanctum 和 Laravel Fortify 之間的區別感到困惑。因為這兩個軟體包解決了兩個不同但相關的問題,Laravel Fortify 和 Laravel Sanctum 並非互斥或競爭關係。
Laravel Sanctum 僅關注管理 API 令牌,並使用會話 cookie 或令牌來認證現有使用者。Sanctum 不提供任何處理使用者註冊、密碼重置等功能的路由。
如果你正在嘗試為一個提供 API 或作為單頁應用後端(SPA)的程式手動構建認證層,你完全有可能同時使用 Laravel Fortify(用於使用者註冊、密碼重置等)和 Laravel Sanctum(用於 API 令牌管理、會話認證)。
安裝
首先,使用 Composer 包管理器安裝 Fortify
1composer require laravel/fortify
接下來,使用 fortify:install Artisan 命令釋出 Fortify 的資源
1php artisan fortify:install
此命令將把 Fortify 的 Action 釋出到你的 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 的單頁應用(SPA),你可能不需要這些路由。因此,你可以透過將應用 config/fortify.php 配置檔案中的 views 配置值設定為 false,來完全停用這些路由。
1'views' => false,
停用檢視與密碼重置
如果你選擇停用 Fortify 的檢視,但仍需要為應用實現密碼重置功能,則仍需定義一個名為 password.reset 的路由,負責顯示應用的“重置密碼”檢視。這是必要的,因為 Laravel 的 Illuminate\Auth\Notifications\ResetPassword 通知會透過 password.reset 命名路由生成密碼重置 URL。
認證
開始之前,我們需要告知 Fortify 如何返回我們的“登入”檢視。請記住,Fortify 是一個無頭(headless)認證庫。如果你想要一個已經為你完成好的 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 / username 和 password。郵箱/使用者名稱 欄位的名稱應與 config/fortify.php 配置檔案中的 username 值匹配。此外,可以提供一個布林值的 remember 欄位,以表明使用者希望使用 Laravel 提供的“記住我”功能。
如果登入嘗試成功,Fortify 會將你重定向到應用 fortify 配置檔案中 home 配置選項設定的 URI。如果登入請求是 XHR 請求,則返回 200 HTTP 響應。
如果請求不成功,使用者將被重定向回登入介面,驗證錯誤資訊將透過共享的 $errors Blade 模板變數提供給你。或者,在 XHR 請求的情況下,驗證錯誤將隨 422 HTTP 響應返回。
自定義使用者認證
Fortify 會根據提供的憑據和為你的應用配置的認證 Guard 自動檢索並認證使用者。但是,有時你可能希望完全自定義如何驗證登入憑據以及如何檢索使用者。值得慶幸的是,Fortify 允許你透過 Fortify::authenticateUsing 方法輕鬆實現這一點。
此方法接受一個接收傳入 HTTP 請求的閉包。該閉包負責驗證請求中附帶的登入憑據並返回關聯的使用者例項。如果憑據無效或找不到使用者,閉包應返回 null 或 false。通常,此方法應在 FortifyServiceProvider 的 boot 方法中呼叫。
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(): void10{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}
認證 Guard
你可以在應用的 fortify 配置檔案中自定義 Fortify 使用的認證 Guard。但是,請確保配置的 Guard 實現了 Illuminate\Contracts\Auth\StatefulGuard。如果你試圖使用 Laravel Fortify 來認證 SPA,你應該使用 Laravel 預設的 web Guard 並結合 Laravel Sanctum。
自定義認證管道
Laravel Fortify 透過一系列可呼叫類(invokable classes)的管道來驗證登入請求。如果需要,你可以定義一個自定義的類管道,讓登入請求依次透過。每個類都應具有一個接收傳入 Illuminate\Http\Request 例項的 __invoke 方法,並且像中介軟體一樣,擁有一個 $next 變數,用於將請求傳遞給管道中的下一個類。
要定義自定義管道,可以使用 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});
認證頻率限制(Throttling)
預設情況下,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}
雙重認證(2FA)
當啟用 Fortify 的雙重認證功能時,使用者需要在認證過程中輸入一個六位數字令牌。此令牌是透過基於時間的一次性密碼(TOTP)生成的,可以從 Google Authenticator 等任何相容 TOTP 的移動認證應用中獲取。
開始之前,首先要確保應用的 App\Models\User 模型使用了 Laravel\Fortify\TwoFactorAuthenticatable Trait
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 Authenticatable10{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
接下來,你應該展示雙重認證二維碼,供使用者掃描到他們的認證應用中。如果你使用 Blade 渲染應用前端,可以透過使用者例項上提供的 twoFactorQrCodeSvg 方法獲取二維碼 SVG。
1$request->user()->twoFactorQrCodeSvg();
如果你正在構建 JavaScript 驅動的前端,可以透過 XHR GET 請求向 /user/two-factor-qr-code 端點發起請求以獲取使用者的雙重認證二維碼。該端點將返回一個包含 svg 鍵的 JSON 物件。
確認雙重認證
除了展示使用者的雙重認證二維碼外,你還應提供一個文字輸入框,供使用者輸入有效的認證程式碼以“確認”其雙重認證配置。此程式碼應透過向 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 欄位,或一個包含使用者恢復程式碼之一的 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 Action 來自定義使用者驗證和建立過程。
密碼重置
請求密碼重置連結
要開始實現應用的密碼重置功能,我們需要告知 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 欄位,以及一個名為 token 的隱藏欄位(其值包含 request()->route('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 Action 來自定義密碼重置過程。
郵箱驗證
註冊後,你可能希望使用者在繼續訪問應用之前驗證其郵箱地址。開始之前,請確保 fortify 配置檔案 features 陣列中啟用了 emailVerification 功能。接下來,確保 App\Models\User 類實現了 Illuminate\Contracts\Auth\MustVerifyEmail 介面。
完成這兩個設定步驟後,新註冊的使用者將收到一封電子郵件,提示他們驗證其郵箱地址所有權。但是,我們需要告知 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}
當用戶被 Laravel 內建的 verified 中介軟體重定向到 /email/verify 端點時,Fortify 將負責定義顯示此檢視的路由。
你的 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 響應返回。