Laravel 經過 Passport 實現 API 請求認證:第三方應用篇(受權碼獲取令牌)

把待接入的第三方應用看做前端系統,把本身的平臺看做後端系統。php

在後端系統註冊第三方應用

在後端應用 blog 中註冊對應的第三方應用 testapp,在 blog 項目根目錄下運行如下命令來註冊 testapp前端

php artisan passport:client
> 
> testapp
> http://app.test/auth/callback

# 顯示結果
CLIENT_ID=9
CLIENT_SECRET=Xde5hsAbpEU8MMjwELFh6RNOzxX2LsrxgFTZvXkP

編寫第三方應用路由和控制器

第一步是到後端系統請求受權,若是用戶在後端系統沒有登陸須要先登陸,登陸以後讓用戶確認受權,受權以後經過 callback 配置的跳轉地址回跳到前端應用,而且在 URL 中帶上受權碼,而後用戶再經過這個受權碼獲取訪問令牌,拿到訪問令牌以後就能夠請求後端系統認證 API 接口了。web

因此,須要在前端應用的 routes/web.php 中新增兩個路由:後端

  • 一個用於請求受權獲取受權碼
  • 一個用於從後端應用跳轉回來,經過受權碼在回跳的路由中發起後端請求獲取令牌
Route::get('/auth', 'Auth\LoginController@oauth');
Route::get('/auth/callback', 'Auth\LoginController@callback');
public function oauth()
{

    $query = http_build_query([
        'client_id' => 9,
        'redirect_uri' => 'http://app.test/auth/callback',
        'response_type' => 'code',
        'scope' => '',
    ]);

    return redirect('http://blog.test/oauth/authorize?' . $query);
}

public function callback(Request $request)
{
    $code = $request->get('code');
    if (!$code) {
        dd('受權失敗');
    }
    
    $http = new Client();
    $response = $http->post('http://blog.test/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => 9,  // your client id
            'client_secret' => "Xde5hsAbpEU8MMjwELFh6RNOzxX2LsrxgFTZvXkP",   // your client secret
            'redirect_uri' => 'http://app.test/auth/callback',
            'code' => $code,
        ],
    ]);

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

測試經過受權碼獲取令牌

在瀏覽器中訪問 http://app.test/auth,在第三方應用中經過後端系統進行受權認證,若是在後端應用 blog.test 上尚未登陸,會先跳轉到登陸頁面,登陸以後則跳轉到確認受權頁面。api

點擊綠色的受權按鈕,就能夠跳轉到第三方應用的回調路由,而後發起獲取令牌的請求獲取訪問令牌。瀏覽器

下次從第三方應用 app.test 中訪問後端系統 API 接口時,就能夠經過在請求頭中帶上 access_token 來獲取 blog.test 上的認證資源了,對應的邏輯和經過密碼獲取令牌訪問是同樣的。app

經過 Postman 進行測試,將 access_token 值拷貝到 Token 字段,而後就能夠發起對認證 API 接口 http://blog.test/api/user 的請求了。post

相關文章
相關標籤/搜索