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_id
與 client_secret
。
另外,從非技術的角度來說,因為 Client Credentials 授權通常會應用在系統與系統串接上,因此實務上會採用這個做法,通常是業務串接場景已經談好了之後,才會開始這麼做的。所以,現在外部「開放」的 OAuth 2.0 授權類型,通常沒有這個項目可以選,而是要經過特別的管道才能申請,像 Linkedin 之前有查到相關的文件,但它是 Business 的方案才能使用的類型。
Hydra 雖然技術上有提供這個功能,但實務上還是需要配合業務場景使用才不會有問題。
今天新增的程式可以在 GitHub Commit 上找到。