在現代 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_id 和 client_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_token 和 refresh_token 的響應。
6. 保護 API 路由
現在,你可以使用 auth:api 中介軟體來保護 API 路由。這將確保只有擁有有效訪問令牌的請求可以訪問這些路由。
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
當用戶攜帶有效的訪問令牌進行請求時,auth:api 中介軟體會自動驗證令牌並讓請求通過。
7. 創建個人訪問令牌
如果你希望用戶可以通過應用生成長期有效的令牌,可以使用個人訪問令牌。這些令牌不需要 client_id 和 client_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 認證。