隨著API的使用逐漸普及,保護API的安全性和可擴展性變得越來越關鍵。而OAuth2已經成為了一種廣泛采用的API安全協議,它允許應用程序通過授權來訪問受保護的資源。為了實現OAuth2身份驗證,Laravel Passport提供了一種簡單、靈活的方式。在本篇文章中,我們將學習如何使用Laravel Passport實現API OAuth2身份驗證。
Laravel Passport是官方提供的一個OAuth2服務器庫,可以輕松地添加OAuth2身份驗證到您的Laravel應用程序中。它針對Laravel框架的客戶端提供了API身份驗證,通過token來保護API并限制資源的訪問。通過很少的配置步驟,你可以創建一個安全的OAuth2服務器并為你的API提供身份驗證和授權。
為了開始使用Laravel Passport,你需要安裝它。你可以通過Composer包管理器安裝它:
composer require laravel/passport
一旦你安裝了Laravel Passport,你需要運行migrations來創建必要的數據庫表:
php artisan migrate
為了啟用Laravel Passport,你需要注冊ServiceProvider和中間件。在config/app.php文件中添加以下ServiceProvider和中間件:
'providers' => [ // ... LaravelPassportPassportServiceProvider::class, ], 'middleware' => [ // ... LaravelPassportHttpMiddlewareCreateFreshApiToken::class, ],
Laravel Passport需要一個用于發行access token和refresh token的“keys”表。運行以下命令將生成此表:
php artisan passport:install
這會創建一個加密的RSA秘鑰對用于簽署和驗證tokens,以及一個名為“personal_access_client”的客戶端和一個名為“password_client”的客戶端。這兩個客戶端用于創建不同類型的tokens。第一個客戶端用于生成個人訪問tokens,這些tokens允許客戶端訪問任何以OAuth2身份驗證方式保護的API端點。第二個客戶端用于創建密碼授權tokens,這些tokens允許客戶端通過用戶名和密碼獲取access token。
在這個過程中,你還需要在你的config/auth.php文件中配置Laravel Passport。你需要將passport驅動器添加到API守衛,以便Laravel Passport來處理一切與OAuth2相關的東西。示例如下:
'guards' => [ // ... 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
現在我們已經完成了設置,我們可以開始創建API路由和控制器了。
首先,你需要定義API路由。例如,假設你有一個API端點來獲取一個任務列表:
Route::get('/tasks', 'TaskController@index')->middleware('auth:api');
接下來,你需要創建一個控制器來處理請求并響應任務:
class TaskController extends Controller { public function index() { $tasks = Task::all(); return response()->json([ 'tasks' => $tasks, ]); } }
在middleware方法中加入“auth:api”參數以指示我們使用API守衛來保護路由。
現在讓我們看看如何執行OAuth2身份驗證并獲得access token。你需要創建一個客戶端,該客戶端將使用密碼授權OAuth2 flow來獲得access token。這樣你就可以通過API請求在API端點上進行身份驗證了。
你可以在Laravel Passport的客戶端列表中創建一個新客戶端,或者在你的代碼中使用Passport::client()方法為客戶端生成一個隨機的client id和client secret。你可以將client id和client secret保存在你的.env文件或你可以在你的Passport::client()方法中直接提供它們。此方法將創建一個新的客戶端,并返回client id和client secret:
use LaravelPassportClient; use IlluminateSupportFacadesDB; $client = $this->createClient(); public function createClient() { $client = Client::forceCreate([ 'user_id' => null, 'name' => 'Test Client', 'secret' => str_random(40), 'redirect' => '', 'personal_access_client' => false, 'password_client' => true, 'revoked' => false, ]); DB::table('oauth_client_grants')->insert([ 'client_id' => $client->id, 'grant_id' => 1, ]); return $client; }
現在我們已經有了一個客戶端,我們需要在控制器中使用Laravel Passport來獲取access token并使用它來訪問受保護的API端點。我們需要使用以下代碼在控制器中實現OAuth2身份驗證:
use IlluminateSupportFacadesAuth; use LaravelPassportClientRepository; class TaskController extends Controller { protected $clients; public function __construct(ClientRepository $clients) { $this->clients = $clients; } public function index() { $client = $this->clients->find(2); $response = $this->actingAsClient($client, function () { return $this->get('/api/tasks'); }); return $response->getContent(); } protected function actingAsClient($client, $callback, $scopes = []) { $proxy = new LaravelPassportHttpControllersAccessTokenController(); $token = $proxy->issueToken( $this->getPersonalAccessTokenRequest($client, $scopes) ); Auth::guard('web')->loginUsingId($client->user_id); $callback($token); return $this->app->make(IlluminateHttpRequest::class); } protected function getPersonalAccessTokenRequest($client, $scopes = []) { $data = [ 'grant_type' => 'client_credentials', 'client_id' => $client->id, 'client_secret' => $client->secret, 'scope' => implode(' ', $scopes), ]; return IlluminateHttpRequest::create('/oauth/token', 'POST', $data); } }
使用actingAsClient()方法,我們可以模擬以客戶端身份運行請求,控制器中的任何方法都可以使用該方法進行OAuth2身份驗證。我們需要傳遞一個客戶端對象,一個回調函數以執行API請求,并可選地傳遞添加到請求中的權限。
現在我們已經完成了Laravel Passport的OAuth2身份驗證配置,通過使用上述代碼模式,我們可以輕松地在我們的API端點上實現安全的OAuth2身份驗證。 Passport是一個相對較新的項目。但是,它是與Laravel完美集成的,并且提供了多種OAuth2身份驗證服務,使您能夠輕松地向您的API添加身份驗證和授權。如果你在運行一個Laravel應用程序并需要添加OAuth2身份驗證,Laravel Passport是實現此目的的理想選擇。