Laravel——Passport OAuth

安裝

在開始以前,請經過 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.phpapi

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
複製代碼

在 AuthServiceProvider 的 boot 方法中調用 Passport::routes 函數。這個函數會註冊發出訪問令牌並撤銷訪問令牌、客戶端和我的訪問令牌所必需的路由:安全

Provinders/AuthServiceProvider.phpbash

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.phpcomposer

'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 () {

});
複製代碼

參考文檔

Laravel5.8

相關文章
相關標籤/搜索