跳到主要內容

Laravel Fortify

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

Laravel Fortify

簡介

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

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

[!NOTE] 請記住,Fortify 是一個旨在為您提供實現 Laravel 認證功能的起步套件的套件。您不必使用它。您可以隨時透過遵循 認證密碼重設電子郵件驗證文檔中可用的文檔來手動與 Laravel 的認證服務互動。

什麼是 Fortify?

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

您不必使用 Fortify 就可以使用 Laravel 的認證功能。您可以隨時透過遵循 認證密碼重設電子郵件驗證文檔中可用的文檔來手動與 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 或作為單頁應用程式後端的應用程式的認證層,您完全有可能同時使用 Laravel Fortify(用於使用者註冊、密碼重設等)和 Laravel Sanctum(API 令牌管理、會話認證)。

安裝

首先,使用 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 預設將公開哪些後端路由/功能。我們建議您只啟用以下功能,這些是大多數 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;

/**
 * 啟動任何應用程式服務。
 */
public function boot(): void
{
    Fortify::loginView(function () {
        return view('auth.login');
    });

    // ...
}

您的登入範本應包含一個向 /login 發出 POST 請求的表單。/login 端點期望一個字串 email/username 和一個 password。電子郵件/使用者名稱欄位的名稱應與 config/fortify.php 配置檔案中的 username 值匹配。此外,可以提供一個布林 remember 欄位來指示使用者希望使用 Laravel 提供的「記住我」功能。

如果登入嘗試成功,Fortify 將重定向到透過應用程式 fortify 配置檔案中的 home 配置選項配置的 URI。如果登入請求是 XHR 請求,將返回 200 HTTP 回應。

如果請求不成功,使用者將被重定向回登入畫面,驗證錯誤將透過共享的 $errorsBlade 範本變數對您可用。或者,在 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;

/**
 * 啟動任何應用程式服務。
 */
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 配置檔案中。

[!NOTE] 結合使用節流、雙因素認證和外部 Web 應用程式防火牆(WAF)將為您的合法應用程式使用者提供最強大的防禦。

自訂重定向

如果登入嘗試成功,Fortify 將重定向到透過應用程式 fortify 配置檔案中的 home 配置選項配置的 URI。如果登入請求是 XHR 請求,將返回 200 HTTP 回應。使用者從應用程式登出後,將被重定向到 / URI。

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

use Laravel\Fortify\Contracts\LogoutResponse;

/**
 * 註冊任何應用程式服務。
 */
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

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')
    
Please finish configuring two-factor authentication below.
@endif

接下來,您應該為使用者顯示雙因素認證二維碼,以便他們掃描到認證器應用程式中。如果您正在使用 Blade 渲染應用程式的前端,可以使用使用者實例上可用的 twoFactorQrCodeSvg 方法來檢索二維碼 SVG:

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

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

確認雙因素認證

除了顯示使用者的雙因素認證二維碼外,您還應提供一個文字輸入,使用者可以在其中提供有效的認證碼來「確認」其雙因素認證配置。應透過向 Fortify 定義的 /user/confirmed-two-factor-authentication 端點發出 POST 請求將此代碼提供給 Laravel 應用程式。

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

@if (session('status') == 'two-factor-authentication-confirmed')
    
Two-factor authentication confirmed and enabled successfully.
@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 如何返回我們的雙因素認證挑戰視圖。Fortify 的所有認證視圖渲染邏輯都可以使用 Laravel\Fortify\Fortify 類別提供的相應方法來自訂。通常,您應該從應用程式的 App\Providers\FortifyServiceProvider 類別的 boot 方法中呼叫此方法:

use Laravel\Fortify\Fortify;

/**
 * 啟動任何應用程式服務。
 */
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 回應。

如果請求不成功,使用者將被重定向回雙因素挑戰畫面,驗證錯誤將透過共享的 $errorsBlade 範本變數對您可用。或者,在 XHR 請求的情況下,驗證錯誤將與 422 HTTP 回應一起返回。

禁用雙因素認證

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

通行密鑰

Fortify 支援使用 WebAuthn 進行通行密鑰認證。通行密鑰允許使用者無需密碼即可使用平台認證器(如 Face ID、Touch ID、Windows Hello 或硬體安全金鑰)進行認證。

啟用通行密鑰

首先,確保在應用程式的 fortify 配置檔案中啟用了 passkeys 功能:

use Laravel\Fortify\Features;

'features' => [
    // ...
    Features::passkeys([
        'confirmPassword' => true,
    ]),
],

confirmPassword 選項決定 Fortify 在註冊或刪除通行密鑰之前是否需要密碼確認

接下來,確保您的應用程式的 App\Models\User 模型實現 Laravel\Fortify\Contracts\PasskeyUser 並使用 Laravel\Fortify\PasskeyAuthenticatable trait:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\Contracts\PasskeyUser;
use Laravel\Fortify\PasskeyAuthenticatable;

class User extends Authenticatable implements PasskeyUser
{
    use Notifiable, PasskeyAuthenticatable;
}

Fortify 的通行密鑰配置選項可以使用應用程式 config/fortify.php 檔案中的 passkeys 配置陣列來自訂:

'passkeys' => [
    'relying_party_id' => parse_url(config('app.url'), PHP_URL_HOST),
    'allowed_origins' => [config('app.url')],
    'user_handle_secret' => config('app.key'),
    'timeout' => 60000,
],

[!NOTE] Fortify 封裝了 laravel/passkeys Composer 套件並為您配置它。如果您正在使用 Fortify 的通行密鑰功能,應使用應用程式的 config/fortify.php 檔案來配置通行密鑰。您不需要發佈 laravel/passkeys 配置檔案,那裡定義的任何值都將被 Fortify 覆蓋。

relying_party_id 應與您應用程式的網域匹配。allowed_origins 陣列列出了可以完成通行密鑰註冊和認證的瀏覽器來源。user_handle_secret 用於派生不透明的使用者標識符,確保在同一通行密鑰註冊中識別相同的使用者。timeout 選項控制通行密鑰註冊和認證操作可以保持活動狀態的時間長度。

Fortify 為其通行密鑰登入、確認和註冊路由應用了專用的通行密鑰速率限制器。如果需要,您可以使用 fortify.limiters.passkeys 配置選項和相應的 RateLimiter::for(...) 定義來自訂它。

JavaScript 客戶端

如果您正在建立自訂前端(包括帶有瀏覽器端腳本的 Blade 應用程式),可以使用官方 @laravel/passkeys 套件。此套件處理瀏覽器 WebAuthn 儀式,並向 Fortify 的通行密鑰端點發送請求。

透過 npm 安裝套件:

npm install @laravel/passkeys

然後,您可以從前端啟動通行密鑰註冊和驗證:

import { Passkeys } from "@laravel/passkeys";

await Passkeys.register({ name: "MacBook Pro" });
await Passkeys.verify();

如果您的應用程式使用自訂通行密鑰端點 URI,您可以按呼叫基礎覆蓋路由:

await Passkeys.verify({
    routes: {
        options: "/passkeys/confirm/options",
        submit: "/passkeys/confirm",
    },
});

await Passkeys.register({
    name: "MacBook Pro",
    routes: {
        options: "/user/passkeys/options",
        submit: "/user/passkeys",
    },
});

該套件還透過 @laravel/passkeys/react@laravel/passkeys/vue@laravel/passkeys/svelte 提供 React、Vue 和 Svelte 輔助函數。

使用通行密鑰進行認證

要使用通行密鑰認證使用者,您的應用程式應首先向 /passkeys/login/options 端點發出 GET 請求。此端點返回前端應傳遞給 navigator.credentials.get(...) 的 WebAuthn 挑戰選項。

瀏覽器返回憑證後,您的應用程式應向 /passkeys/login 發出一個帶有憑證負載的 POST 請求。您還可以包含一個布林 remember 欄位。

如果請求成功,Fortify 將登入使用者到配置的守衛並返回:

  • 標準請求的重定向回應到您的預期目的地。
  • XHR 請求的 200 HTTP 回應,其中包含帶有 redirect 鍵的 JSON 負載。

使用通行密鑰確認密碼

對於已認證的會話,Fortify 提供了滿足 Laravel 對當前會話的密碼確認要求的通行密鑰確認端點。

要使用通行密鑰進行確認,您的應用程式應首先向 /passkeys/confirm/options 發出 GET 請求。此端點返回前端應傳遞給 navigator.credentials.get(...) 的 WebAuthn 挑戰選項。

瀏覽器返回憑證後,您的應用程式應向 /passkeys/confirm 發出一個帶有憑證負載的 POST 請求。

如果請求成功,Fortify 會將當前會話標記為已確認密碼並返回:

  • 標準請求的重定向回應到您的預期目的地。
  • XHR 請求的 200 HTTP 回應,其中包含帶有 redirect 鍵的 JSON 負載。

註冊通行密鑰

要為已認證的使用者註冊通行密鑰,您的應用程式應首先向 /user/passkeys/options 發出 GET 請求。此端點返回前端應傳遞給 navigator.credentials.create(...) 的 WebAuthn 建立選項。

瀏覽器返回憑證後,您的應用程式應向 /user/passkeys 發出一個帶有 name 欄位和 credential 欄位的 POST 請求,其中包含由 navigator.credentials.create(...) 返回的序列化 PublicKeyCredential 物件。

如果請求成功,Fortify 將返回:

  • 標準請求的重定向回應,會話中帶有 passkey-registered 狀態。
  • XHR 請求的 200 HTTP 回應,其中包含帶有 status 鍵的 JSON 負載,以及新註冊的通行密鑰的 idname

刪除通行密鑰

要刪除通行密鑰,您的應用程式應向 /user/passkeys/{passkey} 發出 DELETE 請求。

如果請求成功,Fortify 將返回:

  • 標準請求的重定向回應,會話中帶有 passkey-deleted 狀態。
  • XHR 請求的 200 HTTP 回應,其中包含帶有 status 鍵的 JSON 負載。

註冊

要開始實現應用程式的註冊功能,我們需要指示 Fortify 如何返回我們的「註冊」視圖。請記住,Fortify 是一個無頭認證函式庫。如果您希望有一個已經為您完成的 Laravel 認證功能的前端實現,您應該使用應用程式入門套件

Fortify 的所有視圖渲染邏輯都可以使用 Laravel\Fortify\Fortify 類別提供的相應方法來自訂。通常,您應該從 App\Providers\FortifyServiceProvider 類別的 boot 方法中呼叫此方法:

use Laravel\Fortify\Fortify;

/**
 * 啟動任何應用程式服務。
 */
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 回應。

如果請求不成功,使用者將被重定向回註冊畫面,驗證錯誤將透過共享的 $errorsBlade 範本變數對您可用。或者,在 XHR 請求的情況下,驗證錯誤將與 422 HTTP 回應一起返回。

自訂註冊

可以透過修改安裝 Laravel Fortify 時生成的 App\Actions\Fortify\CreateNewUser 動作來自訂使用者驗證和建立過程。

密碼重設

請求密碼重設連結

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

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

use Laravel\Fortify\Fortify;

/**
 * 啟動任何應用程式服務。
 */
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 會話變數可用於顯示密碼重設連結請求嘗試的狀態。

$status 會話變數的值將與您應用程式 passwords語言檔案中定義的翻譯字串之一匹配。如果您希望自訂此值且尚未發佈 Laravel 的語言檔案,可以透過 lang:publish Artisan 命令來執行此操作:

@if (session('status'))
    
{{ session('status') }}
@endif

如果請求不成功,使用者將被重定向回請求密碼重設連結畫面,驗證錯誤將透過共享的 $errorsBlade 範本變數對您可用。或者,在 XHR 請求的情況下,驗證錯誤將與 422 HTTP 回應一起返回。

重設密碼

要完成實現應用程式的密碼重設功能,我們需要指示 Fortify 如何返回我們的「重設密碼」視圖。

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

use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;

/**
 * 啟動任何應用程式服務。
 */
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 會話變數,以便您可以在登入畫面上顯示重設的成功狀態:

@if (session('status'))
    
{{ session('status') }}
@endif

如果請求是 XHR 請求,將返回 200 HTTP 回應。

如果請求不成功,使用者將被重定向回重設密碼畫面,驗證錯誤將透過共享的 $errorsBlade 範本變數對您可用。或者,在 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;

/**
 * 啟動任何應用程式服務。
 */
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 會話變數,允許您向使用者顯示一條資訊訊息,告知他們操作成功。如果請求是 XHR 請求,將返回 202 HTTP 回應:

@if (session('status') == 'verification-link-sent')
    
A new email verification link has been emailed to you!
@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;

/**
 * 啟動任何應用程式服務。
 */
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 回應一起返回。