Access Token 用來存取受保護資源的憑證。通常 Access Token 都是屬於不透明的 Token,Hydra 預設也是這麼設計的。必須要拿 Access Token 向 Hydra 請求才能取得使用者的相關資訊。這在 OpenID Connect Core 1.0 - 5.3. UserInfo Endpoint 裡有明確定義 OP 應該要提供什麼公開接口讓 RP 取得使用者資訊。Hydra SDK 的 Public API 物件雖然有提供呼叫的方法,但因為它的 Model 所呈現的資料並不完整,因此建議自己打 API 取得資料比較好。API 位址如下:
http://127.0.0.1:4444/userinfo
對應的範例程式如下:
$userinfoEndpoint = $hydra->getConfig()->getHost() . '/userinfo';
$userInfo = Http::withToken($tokenResponse->getAccessToken())
->get($userinfoEndpoint);
Log::debug('User info: ', $userInfo->json());
這裡使用 Laravel 的 HTTP Facase 完成請求,關鍵是要設定 Access Token 後,才能呼叫對應的 API。而最後 Log 所印出來的 JSON 內容如下:
{
"aud": [
"my-rp"
],
"auth_time": 1664528077,
"iat": 1664528079,
"iss": "http://127.0.0.1:4444/",
"rat": 1664528071,
"sub": "1"
}
這裡的 sub
與 ID Token 的 sub
意義相同。實際上這裡的內容,是取得 Hydra 保存在 Session(指的是資料庫)裡的資料,然後經過過濾出來的。而 Session 的資料可以在 Consent Provider 處理同意請求的時候,再將想放的資訊放入。
協定上只有規定 sub
是必填,如果請求回應是 JWT 則需要提供 aud
與 iss
資訊,其他內容就沒有特別強制的要求,但有預定義有哪些相關的使用者個人資料。
userinfo 主要是在取得使用者相關的資料,但好像還少了些什麼,像 exp 欄位就沒有提供,因此無法知道相關的資訊。
Hydra 有實作 RFC 7662 - OAuth 2.0 Token Introspection,中文可以稱為 Token 自我檢查,可以檢查 Token 的狀態,包括 Access Token 或 Refresh Token。
Hydra 這個 API 是放在 Admin API 的,所以要換取得 Admin API 的設定:
$introspectToken = $admin->introspectOAuth2Token($tokenResponse->getAccessToken());
Log::debug('Token Introspection: ', json_decode((string)$introspectToken, true));
Log 取得的內容如下:
{
"active": true,
"aud": [],
"client_id": "my-rp",
"exp": 1664535594,
"iat": 1664531994,
"iss": "http://127.0.0.1:4444/",
"nbf": 1664531994,
"scope": "openid",
"sub": "1",
"token_type": "Bearer",
"token_use": "access_token"
}
這個跟 JWT 的 Claim 很相似,主要多了幾個欄位,像 scope
和 token_type
,這兩個是之前身分驗證回應的資訊,這裡就不重覆做說明;而 token_use
從原始碼的描述與值看起來,也算是一種 Token 的類型,不過比較像是不同的授權流程所產生的結果,像是 access_token
或 refresh_token
。
今天 Access Token 的主題比較簡單,到這裡先結束。目前看到的資訊都是 Hydra 的標配內容,接下來明天就會讓 Provider 來多做一些客製化,來順利傳額外的資訊。