Laravel 經過 Passport 實現 API 請求認證:移動端應用篇(密碼受權令牌)

建立一個移動端測試應用

composer create-project --prefer-dist laravel/laravel testapp

要讓移動端應用和後端應用之間進行受權認證,須要在後端應用 blog 中註冊對應的移動端應用 testapp,在 blog 項目根目錄下運行如下命令來註冊 testappphp

php artisan passport:client --password
testapp
# 顯示結果
CLIENT_ID=7
CLIENT_SECRET=2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco

testapp 應用中,將藉助 Laravel 自帶的認證腳手架快速實現認證路由和視圖,以完成登陸表單和請求提交:前端

php artisan make:auth

Auth/LoginController 控制器中重寫 login 方法,將默認到數據庫查詢用戶登陸憑證的邏輯改成將請求發送到後端應用獲取受權令牌:laravel

// 在控制器頂部引入以下命名空間
use GuzzleHttp\Client;
use Illuminate\Http\Request;

// 重寫 AuthenticatesUsers 中的 login 方法
public function login(Request $request)
{
    $request->validate([
        'email' => 'required|string',
        'password' => 'required|string',
    ]);

    $http = new Client();
    // 發送相關字段到後端應用獲取受權令牌
    $response = $http->post('http://blog.test/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => 7,
            'client_secret' => "2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco",
            'username' => $request->input('email'),
            'password' => $request->input('password'),
            'scope' => '*'
        ],
    ]);

    return response($response->getBody());
}

訪問移動端應用登陸頁面 http://app.test/login,輸入在後端應用 blog 中註冊過的用戶信息,點擊登陸,會將用戶登陸憑證和應用配置傳遞到後端應用的 oauth/token 路由,經過後端應用中 Passport 底層的密碼受權類進行校驗,校驗成功後就會返回令牌信息給移動端應用。數據庫

返回結果中包含四個字段:後端

  • access_token 是受權令牌,能夠將這個值設置到 Bearer Authentication 請求頭去請求須要認證的後端 API 接口
  • token_type 表示認證類型是 Bearer
  • refresh_token 用於在令牌過時後刷新令牌
  • expires_in 表示令牌的有效期(單位是秒,即有效期一年)

在 Postman 中請求後端 API 接口 http://blog.test/api/user ,選擇請求 Authorization 的類型爲 Bearer Token,而後將 access_token 值拷貝到 Token 字段中,發起請求就能夠獲取到認證接口返回數據了。api

後端應用設置令牌的有效期

能夠在 AuthServiceProviderboot 方法中經過 Passport 門面上的 tokensExpireInrefreshTokensExpireIn 方法來設置令牌有效期:app

Passport::tokensExpireIn(now()->addDays(7));
# 或
Passport::refreshTokensExpireIn(now()->addDays(7));

前端應用刷新令牌

當受權訪問令牌過時後,能夠請求 oauth/token 路由並指定操做類型爲 refresh_token 來刷新令牌:composer

$http = new GuzzleHttp\Client;

$response = $http->post('http://blog.test/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'your-refresh-token',
        'client_id' => 'your-client-id',
        'client_secret' => 'your-client-secret',
        'scope' => '*',
    ],
]);

return response($response->getBody());

刷新令牌後,會生成新的令牌並返回,同時將老的令牌撤銷。ide

相關文章
相關標籤/搜索