安裝
在開始之前,請通過 Composer 包管理器安裝 Passport:
composer require laravel/passport
複製程式碼
Passport 服務提供器使用框架註冊自己的資料庫遷移目錄,因此在註冊提供器後,就應該執行 Passport 的遷移命令來自動建立儲存客戶端和令牌的資料表:
php artisan migrate
複製程式碼
接下來,執行 passport:install 命令來建立生成安全訪問令牌時所需的加密金鑰,同時,這條命令也會建立用於生成訪問令牌的「個人訪問」客戶端和「密碼授權」客戶端:
php artisan passport:install
複製程式碼
配置
上面命令執行後,請將 Laravel\Passport\HasApiTokens Trait 新增到 User 模型中, 這個 Trait 會給你的模型提供一些輔助函式,用於檢查已認證使用者的令牌和使用範圍:
Models/User.php
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
複製程式碼
在 AuthServiceProvider 的 boot 方法中呼叫 Passport::routes 函式。這個函式會註冊發出訪問令牌並撤銷訪問令牌、客戶端和個人訪問令牌所必需的路由:
Provinders/AuthServiceProvider.php
public function boot()
{
$this->registerPolicies();
Passport::routes();
//設定token過期時間
Passport::tokensExpireIn(now()->addDays(1));
//設定重新整理token過期時間
Passport::refreshTokensExpireIn(now()->addDays(30));
}
複製程式碼
將配置檔案 config/auth.php 中授權看守器 guards 的 api 的 driver 選項改為 passport。此調整會讓你的應用程式在在驗證傳入的 API 的請求時使用 Passport 的 TokenGuard 來處理:
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
],
複製程式碼
密碼模式
在應用程式通過密碼授權機制來發布令牌之前,在 passport:client 命令後加上 --password 引數來建立密碼授權的客戶端。如果你已經執行了 passport:install 命令,則不需要再執行此命令:
php artisan passport:client --password
請求令牌
建立密碼授權的客戶端後,就可以使用使用者的電子郵件地址和密碼向 /oauth/token
路由發出 POST 請求來獲取訪問令牌。而該路由已經由 Passport::routes 方法註冊,因此不需要手動定義它。如果請求成功,會在服務端返回的 JSON 響應中收到一個 access_token 和 refresh_token:
請求引數:
'grant_type' => 'password',
'client_id' => 'client-id', //需要使用password_client=1
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
複製程式碼
自定義使用者名稱欄位
當使用密碼授權時,Passport 預設使用 email 作為「使用者名稱」。但是,你可以通過在模型上定義一個 findForPassport 方法來自定義使用者名稱欄位:
Models/User.php
/**
* 通過使用者名稱找到對應的使用者資訊
*
* @param string $username
* @return \App\User
*/
public function findForPassport($username)
{
return $this->where('username', $username)->first();
}
複製程式碼
路由保護
通過中介軟體
Passport 包含一個 驗證保護機制 可以驗證請求中傳入的訪問令牌。配置 api 的看守器使用 passport 驅動程式後,只需要在需要有效訪問令牌的任何路由上指定 auth:api 中介軟體:
Route::middleware('auth:api')->group(function () {
});
複製程式碼