使用 Laravel Passport 實現 API 認證


在現代 Web 應用中,API 認證是一個至關重要的部分,特別是在構建需要保護用戶資料的應用時。Laravel 提供了多種方法來實現 API 認證,其中最強大且靈活的工具之一就是 Laravel Passport。本文將帶你了解如何使用 Laravel Passport 來實現 API 認證,並涵蓋整個過程的詳細步驟。

1. Laravel Passport 介紹

Laravel Passport 是 Laravel 提供的完整 OAuth2 認證系統,通過它,你可以為應用程式生成並管理訪問令牌。這些令牌可以用來保護 API 端點,並確保只有授權的用戶可以訪問。

2. 安裝 Laravel Passport

首先,你需要在 Laravel 專案中安裝 Passport。通過 Composer 安裝 Passport 套件:

composer require laravel/passport

接下來,你需要運行 Passport 的安裝命令來生成所需的數據表和檔案:

php artisan passport:install

這個命令會生成加密金鑰和必要的數據表來存儲 OAuth 客戶端及訪問令牌。

3. 設定 Passport

app/Providers/AuthServiceProvider.php 中,你需要將 Passport 的 routes 方法加入到 boot 方法中:

use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();

    Passport::routes();
}

你也可以選擇在這裡自定義令牌的過期時間:

Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));

最後,在 config/auth.php 中,你需要將 API 驗證守衛的 driver 設置為 passport

'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

4. 創建 OAuth 客戶端

為了使用 Passport,你需要創建一個 OAuth 客戶端。在命令行中運行以下命令:

php artisan passport:client

這將引導你設置一個新的 OAuth 客戶端,並生成一組 client_idclient_secret,這些值將在應用中使用。

5. 使用 Passport 的內建端點

Laravel Passport 提供了一些內建的路由來處理 OAuth 流程。這些路由處理用戶的註冊、登入和令牌發放。例如,你可以發送一個 POST 請求到 /oauth/token 來獲取訪問令牌。

以下是使用 password 授權類型的範例:

POST /oauth/token

{
    "grant_type": "password",
    "client_id": "client-id",
    "client_secret": "client-secret",
    "username": "user@example.com",
    "password": "password"
}

成功請求後,你會獲得一個包含 access_tokenrefresh_token 的響應。

6. 保護 API 路由

現在,你可以使用 auth:api 中介軟體來保護 API 路由。這將確保只有擁有有效訪問令牌的請求可以訪問這些路由。

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

當用戶攜帶有效的訪問令牌進行請求時,auth:api 中介軟體會自動驗證令牌並讓請求通過。

7. 創建個人訪問令牌

如果你希望用戶可以通過應用生成長期有效的令牌,可以使用個人訪問令牌。這些令牌不需要 client_idclient_secret

$user = User::find(1);
$token = $user->createToken('Personal Access Token');
return ['token' => $token->accessToken];

這會生成一個個人訪問令牌,你可以在 API 請求中使用這個令牌來進行認證。

8. 令牌刷新與撤銷

Passport 支持令牌刷新功能,當一個訪問令牌過期時,可以使用 refresh_token 來獲取新的訪問令牌。

如果需要撤銷一個令牌,你可以使用以下方式:

$user->tokens->each(function ($token, $key) {
    $token->delete();
});

這將撤銷用戶的所有訪問令牌。

9. 測試 API 認證

為了確保一切正常運行,你應該撰寫測試來驗證 API 認證功能。你可以使用 Laravel 的測試工具來模擬用戶登錄並獲取訪問令牌,然後測試受保護的路由是否正確響應。

public function test_user_can_login_and_get_token()
{
    $user = User::factory()->create([
        'email' => 'user@example.com',
        'password' => bcrypt('password'),
    ]);

    $response = $this->postJson('/oauth/token', [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => $user->email,
        'password' => 'password',
    ]);

    $response->assertStatus(200);
    $this->assertArrayHasKey('access_token', $response->json());
}

這個測試會驗證用戶是否可以成功登錄並獲取訪問令牌。

結論

Laravel Passport 是一個強大的工具,讓開發者可以輕鬆地在應用中實現 API 認證。通過本文介紹的步驟,你可以快速地為你的 API 添加認證功能,並保護你的應用免受未授權訪問。希望這篇文章能幫助你在專案中成功地實現 API 認證。