Laravel開發:如何使用Laravel Passport和JWT實作API身分驗證?
API(Application Programming Interface)身份驗證,是在當今網路應用中普遍存在的需求。 Laravel作為一個受歡迎的PHP框架,提供了Laravel Passport和JWT(JSON Web Tokens)兩種工具,可以幫助我們實現API驗證。
本文將介紹如何使用Laravel Passport和JWT實作API身分驗證。在接下來的內容中,我們將了解這兩種工具的基本概念,以及如何在Laravel應用程式中設定和使用它們。
什麼是Laravel Passport?
Laravel Passport是一個專門為Laravel框架開發的OAuth2伺服器,可以幫助我們快速且安全地建構API身分驗證系統。 Passport提供了一組API來執行認證流程,並且已經內部實作了一系列OAuth2協議規定的認證方式。
其中,OAuth2是一種使用代理授權方式的標準協定。代理授權是一種為代表使用者取得存取資源的權限的授權機制。 OAuth2協定透過向第三方應用程式頒發“存取權杖”,來代表使用者存取受保護的資源。所以,Passport其實是在Laravel應用程式中扮演OAuth2認證伺服器的角色。
什麼是JWT?
JWT(JSON Web Tokens)是一種用於分散式網路環境中的身份驗證和授權的開放標準(RFC 7519)。 JWT通常被用來在客戶端和服務端之間傳遞被認證的使用者識別資訊和聲明。 JWT由三個部分組成:頭部、負荷和簽名。
通常,頭部包含了JWT的類型和使用的加密演算法,載荷包含了用戶身份資訊和聲明,簽名用於驗證JWT的真實性。使用JWT進行身份驗證時,服務端透過解密JWT中的資訊來判斷使用者身份,從而實現API身份驗證。
設定Laravel Passport和JWT
在使用Laravel Passport和JWT進行API驗證前,我們需要先在Laravel應用程式中進行設定。以下是具體設定步驟:
步驟一:安裝Laravel Passport和tymon/jwt-auth
在命令列工具中使用composer安裝Laravel Passport和tymon/jwt-auth:
composer require laravel/passport composer require tymon/jwt-auth
步驟二:設定Laravel Passport
在config/app.php檔案中,新增下列服務提供者:
'providers' => [ ... LaravelPassportPassportServiceProvider::class, ],
然後,執行下列指令來建立Passport的資料表:
php artisan migrate
對於Passport的預設認證方式“Password Grant”,我們在User模型中增加“PassportHasApiTokens”(Passport預設的使用者認證Trait)。開啟User.php文件,增加以下內容:
use LaravelPassportHasApiTokens; class User extends Authenticatable { use HasApiTokens, Notifiable; ... }
步驟三:設定JWT
#首先,在config/app.php檔案中,加入JWTServiceProvider:
'providers' => [ ... TymonJWTAuthProvidersLaravelServiceProvider::class, ],
然後,執行以下命令來產生JWT所需的秘鑰:
php artisan jwt:secret
在config/auth.php檔案中,增加jwt守衛配置(將jwt作為守衛guard的選項),並將預設的認證磁碟機driver設定為「jwt」:
'guards' => [ ... 'jwt' => [ 'driver' => 'jwt', 'provider' => 'users' ], ], ... 'defaults' => [ 'guard' => 'jwt', ... ],
在config/auth.php檔案中,增加JWT的使用者提供者users配置(指示使用Eloquent模型):
'providers' => [ ... 'users' => [ 'driver' => 'eloquent', 'model' => AppModelsUser::class ] ],
使用Laravel Passport和JWT進行API驗證
準備工作完成後,我們就可以愉快地使用Laravel Passport和JWT實作API身分驗證了。以下是具體操作流程:
步驟一:註冊API路由
首先,在routes/api.php檔案中註冊API路由。例如,我們定義一個用於獲取用戶資訊的GET路由:
Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); });
這裡使用了Laravel的中間件auth:api,它將確保已認證用戶的請求能夠通過。透過路由中間件,我們在路由中新增了身份驗證的這個步驟。
步驟二:建立存取令牌
使用者需要透過存取令牌來存取API。我們需要使用密碼授權存取令牌,具體實作步驟如下:
需要先定義一個路由,接收使用者提供的使用者名稱和密碼:
Route::post('/login', function (Request $request) { $http = new GuzzleHttpClient; $response = $http->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'username' => $request->username, 'password' => $request->password, 'scope' => '', ], ]); return json_decode((string) $response->getBody(), true); });
在上述程式碼中,我們使用了GuzzleHttp客戶端來發送POST請求,取得存取權杖。其中,grant_type必須是“password”,client_id和client_secret分別對應Laravel Passport中所應用的ID和Secret。請求成功後,將傳回一個JSON回應,其中包含使用者存取API的存取權杖access_token。
步驟三:發起API請求
我們可以使用取得到的令牌access_token,向API發送請求,驗證使用者身份,並取得受保護的資源。在向API發起請求時,必須在header中增加Authorization鍵值對,其值為「Bearer access_token」。例如:
$accessToken = 'your-access-token'; $response = $http->withHeaders([ 'Authorization' => 'Bearer ' . $accessToken ])->get('http://your-app.com/api/user');
如果請求成功,API將傳回使用者資訊。
結論
在Laravel應用程式中,Laravel Passport提供了強大的OAuth2驗證協定和API認證功能,而JWT是一種安全且方便的身份驗證方式。在實際開發中,我們可以結合使用Laravel Passport和JWT,以提高API的安全性和可靠性,保護使用者資料不被惡意攻擊者所竊取或竄改。
以上是Laravel開發:如何使用Laravel Passport和JWT實作API身分驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!