Your cart is currently empty!
使用 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_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 認證。