在開始以前,請經過 Composer 包管理器安裝 Passport:php
composer require laravel/passport
複製代碼
Passport 服務提供器使用框架註冊本身的數據庫遷移目錄,所以在註冊提供器後,就應該運行 Passport 的遷移命令來自動建立存儲客戶端和令牌的數據表:laravel
php artisan migrate
複製代碼
接下來,運行 passport:install 命令來建立生成安全訪問令牌時所需的加密密鑰,同時,這條命令也會建立用於生成訪問令牌的「我的訪問」客戶端和「密碼受權」客戶端:web
php artisan passport:install
複製代碼
上面命令執行後,請將 Laravel\Passport\HasApiTokens Trait 添加到 User 模型中, 這個 Trait 會給你的模型提供一些輔助函數,用於檢查已認證用戶的令牌和使用範圍:數據庫
Models/User.php
api
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
複製代碼
在 AuthServiceProvider 的 boot 方法中調用 Passport::routes 函數。這個函數會註冊發出訪問令牌並撤銷訪問令牌、客戶端和我的訪問令牌所必需的路由:安全
Provinders/AuthServiceProvider.php
bash
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 來處理:session
config/auth.php
composer
'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 () {
});
複製代碼