Laravel——Passport OAuth

Ctrl_C發表於2019-04-18

安裝

在開始之前,請通過 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 () {

});
複製程式碼

參考文件

Laravel5.8

相關文章