Laravel Fortify
簡介
Laravel Fortify 是一個與前端框架無關的 Laravel 身份驗證後端實作。Fortify 註冊實作 Laravel 所有身份驗證功能所需的路由和控制器,包括登入、註冊、密碼重設、電子郵件驗證等等。安裝 Fortify 後,您可以執行 route:list
Artisan 命令來查看 Fortify 已註冊的路由。
由於 Fortify 沒有提供自己的使用者介面,因此它旨在與您自己的使用者介面配對使用,後者會向其註冊的路由發出請求。我們將在本文件的其餘部分討論如何向這些路由發出請求。
請記住,Fortify 是一個旨在讓您在實作 Laravel 的身份驗證功能時搶先一步的套件。您並非必須使用它。 您始終可以自由地透過遵循 身份驗證、密碼重設 和 電子郵件驗證 文件中提供的文件,手動與 Laravel 的身份驗證服務互動。
什麼是 Fortify?
如前所述,Laravel Fortify 是一個與前端框架無關的 Laravel 身份驗證後端實作。Fortify 註冊實作 Laravel 所有身份驗證功能所需的路由和控制器,包括登入、註冊、密碼重設、電子郵件驗證等等。
您並非必須使用 Fortify 才能使用 Laravel 的身份驗證功能。 您始終可以自由地透過遵循 身份驗證、密碼重設 和 電子郵件驗證 文件中提供的文件,手動與 Laravel 的身份驗證服務互動。
如果您是 Laravel 的新手,您可能希望在嘗試使用 Laravel Fortify 之前,先探索 我們的應用程式入門套件。我們的入門套件為您的應用程式提供身份驗證骨架,其中包括使用 Tailwind CSS 建構的使用者介面。這讓您可以先研究並熟悉 Laravel 的身份驗證功能,然後再讓 Laravel Fortify 為您實作這些功能。
Laravel Fortify 本質上是採用我們的應用程式入門套件的路由和控制器,並將它們作為一個不包含使用者介面的套件提供。這讓您仍然可以快速搭建應用程式身份驗證層的後端實作,而不會被任何特定的前端意見所束縛。
我應該何時使用 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 cookies 或令牌驗證現有使用者。Sanctum 沒有提供任何處理使用者註冊、密碼重設等功能的路由。
如果您嘗試為提供 API 或作為單頁應用程式後端的應用程式手動建構身份驗證層,則完全有可能同時使用 Laravel Fortify(用於使用者註冊、密碼重設等)和 Laravel Sanctum(API 令牌管理、session 身份驗證)。
安裝
首先,使用 Composer 套件管理器安裝 Fortify
1composer require laravel/fortify
接下來,使用 fortify:install
Artisan 命令發布 Fortify 的資源
1php artisan fortify:install
此命令會將 Fortify 的 actions 發布到您的 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 驅動的單頁應用程式,您可能不需要這些路由。因此,您可以透過將應用程式 config/fortify.php
設定檔中的 views
設定值設定為 false
來完全停用這些路由
1'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
路由
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
方法輕鬆完成此操作。
此方法接受一個 closure,該 closure 接收傳入的 HTTP 請求。該 closure 負責驗證附加到請求的登入憑證,並傳回關聯的使用者實例。如果憑證無效或找不到使用者,closure 應傳回 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 透過一系列可調用類別的管道驗證登入請求。如果您願意,您可以定義自訂的類別管道,登入請求應透過該管道傳輸。每個類別都應具有 __invoke
方法,該方法接收傳入的 Illuminate\Http\Request
實例,並且像 中介層 一樣,有一個 $next
變數,該變數被調用以將請求傳遞到管道中的下一個類別。
若要定義您的自訂管道,您可以使用 Fortify::authenticateThrough
方法。此方法接受一個 closure,該 closure 應傳回要透過其傳輸登入請求的類別陣列。通常,此方法應從應用程式 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});
身份驗證節流
預設情況下,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}
雙重身份驗證
當 Fortify 的雙重身份驗證功能啟用時,使用者需要在身份驗證過程中輸入六位數的數字令牌。此令牌是使用基於時間的一次性密碼 (TOTP) 產生的,可以從任何 TOTP 相容的行動身份驗證應用程式(例如 Google Authenticator)中檢索。
在開始之前,您應首先確保應用程式的 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
session 變數將設定為 two-factor-authentication-enabled
。您可以在範本中偵測到此 status
session 變數,以顯示適當的成功訊息。如果請求是 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
接下來,您應該顯示雙重身份驗證 QR 碼,供使用者掃描到其身份驗證器應用程式中。如果您使用 Blade 渲染應用程式的前端,您可以使用使用者實例上提供的 twoFactorQrCodeSvg
方法檢索 QR 碼 SVG
1$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
session 變數將設定為 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
action 預期會有一個 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 身份驗證功能的前端實作,您應該使用 應用程式入門套件。
所有 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
session 變數來顯示密碼重設連結請求嘗試的狀態。
$status
session 變數的值將與應用程式 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')
的值。「電子郵件」欄位/資料庫欄的名稱應與應用程式 fortify
設定檔中定義的 email
設定值相符。
處理密碼重設回應
如果密碼重設請求成功,Fortify 會重新導向回 /login
路由,以便使用者可以使用其新密碼登入。此外,將設定一個 status
session 變數,以便您可以在登入畫面上顯示重設成功的狀態
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}
Fortify 將負責定義路由,當使用者被 Laravel 內建的 verified
中介層重新導向到 /email/verify
端點時,該路由會顯示此視圖。
您的 verify-email
範本應包含一條資訊訊息,指示使用者點擊發送到其電子郵件地址的電子郵件驗證連結。
重新發送電子郵件驗證連結
如果您願意,您可以將一個按鈕新增到應用程式的 verify-email
範本中,該按鈕觸發向 /email/verification-notification
端點發出的 POST 請求。當此端點收到請求時,新的驗證電子郵件連結將透過電子郵件發送給使用者,允許使用者在先前的連結意外刪除或遺失時取得新的驗證連結。
如果重新發送驗證連結電子郵件的請求成功,Fortify 會將使用者重新導向回 /email/verify
端點,並帶有一個 status
session 變數,讓您可以向使用者顯示一條資訊訊息,告知他們操作成功。如果請求是 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']);
密碼確認
在建構應用程式時,您偶爾可能會有一些 action 應要求使用者在執行 action 之前確認其密碼。通常,這些路由受到 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 回應返回。