iT邦幫忙

2022 iThome 鐵人賽

DAY 17
1
Software Development

30 天與九頭蛇先生做好朋友系列 第 17

實作 Client Credentials 授權

  • 分享至 

  • xImage
  •  

Hydra 提供了三種 OAuth 2.0 授權類型,其中 Implicit 在第六天的快速體驗有說明,而 Authorization Code 則是實作程式的時候所使用的。今天要來實作第三種--Client Credentials 授權。

程式我們來使用指令實作,首先先產生指令程式:

php artisan make:command OAuth2Token

再來實作程式 app/Console/Commands/OAuth2Token.php

class OAuth2Token extends Command
{
    protected $signature = 'oauth2:token';

    protected $description = 'Generate OAuth 2.0 by Client Credentials Grant';

    public function handle(): int
    {
        $token = '';

        $this->info($token);

        return 0;
    }
}

外框的程式準備好之後,可以開始來寫程式。發出請求的時候,要指定 grant_type=client_credentials,即可請求成功,對應到 SDK 的程式如下:

$tokenResponse = $hydra->oauth2Token('client_credentials');

就是這麼簡單。

再來來看程式碼全貌,考慮到 debug 方便,有加了 --debug--introspect 兩個參數:

class OAuth2Token extends Command
{
    protected $signature = 'oauth2:token {--debug} {--introspect}';

    protected $description = 'Generate OAuth 2.0 by Client Credentials Grant';

    public function handle(PublicApi $hydra, AdminApi $admin): int
    {
        $tokenResponse = $hydra->oauth2Token('client_credentials');

        if ($this->option('debug')) {
            dump($tokenResponse);
        }

        $token = $tokenResponse->getAccessToken();

        $this->line($token);

        if ($this->option('introspect')) {
            dump($admin->introspectOAuth2Token($token));
        }

        return 0;
    }
}

這裡可以看一下 introspect 得到的結果:

[
    "active" => true
    "aud" => [],
    "clientId" => "my-rp",
    "exp" => 1664683233,
    "ext" => null,
    "iat" => 1664679633,
    "iss" => "http://127.0.0.1:4444/",
    "nbf" => 1664679633,
    "obfuscatedSubject" => null,
    "scope" => null,
    "sub" => "my-rp",
    "tokenType" => "Bearer",
    "tokenUse" => "access_token",
    "username" => null,
]

這裡會發現一個特別的地方:這裡的 sub 值與 client_id 值是一樣的。這就對應到了第三天提到 Client Credentials 授權的應用場景:應用程式就是資源所有者。

隱含要做的細節

好像結束了,但真的有那麼簡單?其實有件事是隱含被完成的,因為這次鐵人賽是同個 codebase 持續新增功能,有些事是過去已經完成的。

在請求 Client Credentials 授權,因為 sub 是指應用程式,因此請求的時候必須跟 Hydra 說自己是 my-rp 它才會回傳 my-rp 的 Access Token。這段程式是放在 SDK 初始化的時候,有給應用程式驗證資訊 client_idclient_secret

另外,從非技術的角度來說,因為 Client Credentials 授權通常會應用在系統與系統串接上,因此實務上會採用這個做法,通常是業務串接場景已經談好了之後,才會開始這麼做的。所以,現在外部「開放」的 OAuth 2.0 授權類型,通常沒有這個項目可以選,而是要經過特別的管道才能申請,像 Linkedin 之前有查到相關的文件,但它是 Business 的方案才能使用的類型。

Hydra 雖然技術上有提供這個功能,但實務上還是需要配合業務場景使用才不會有問題。

今天新增的程式可以在 GitHub Commit 上找到。


上一篇
ID Token 的驗證實作
下一篇
實作撤銷授權
系列文
30 天與九頭蛇先生做好朋友23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言