連接點滴:深入探索 OIDC 資源與你的 JWT 訪問令牌
這篇博客文章旨在揭示 OIDC 資源指標與其在獲取訪問令牌過程中的角色之間的關係。
背景
在 之前的一個會議中,我們介紹了 OpenID Connect (OIDC) 協議、刷新令牌、訪問令牌和 ID 令牌,這些是構建應用程式中強大身份驗證的基本組件。然而,我們的社群中仍有一些問題揮之不去,其中一個反覆出現的疑問是:「為什麼我的訪問令牌不是 JWT?」
對於新接觸這些概念的人,甚至對於需要溫故知新的人,這篇博客文章旨在揭示 OIDC 資源指標與其在獲取訪問令牌過程中的角色之間的關係。
理解 OIDC 資源
如果你熟悉 OAuth 2.0 協議,資源這個詞應該會勾起你的回憶。由於 OIDC 是建立在 OAuth 2.0 基礎上的,它繼承了相同的概念。
"資源"或"受保護的資源"是客戶端應用程式想要代表經過身份驗證用戶訪問的實體表示。這可以是用戶資訊、伺服器 API 或任何其他由你的伺服器授權的數據。
根據協議,資源是發送給授權伺服器請求中的一個參數。它是一個表示為絕對 URI 的值,例如 https://my-company.com/api
。它作為資源的標識符,可能對應於一個網絡可尋址的位置甚至一個唯一但虛構的 URI。
在 Logto,你可以通過“管理控制台 → API 資源”頁面創建一個“API 資源”。欲了解更多詳細資訊,你可以參考這份文件。
JWT 訪問令牌
當在訪問令牌請求中指定了"資源"參數時,才會發出 JWT(JSON Web Token)格式的訪問令牌,它包含了一組聲明,你可以解密和驗證這些聲明,例如確保令牌的完整性和用戶的權限。
這個"資源"就成為 JWT 中的一個 aud
令牌聲明,表示令牌的目標受眾。請參見 RFC-7519。
因此,關係變得明顯:
- 在請求 JWT 令牌時指定資源指標。
- 資源指標與
aud
令牌聲明對齊。 - 當進行 API 請求時,必須將 JWT 訪問令牌作為承載令牌標頭包含在內。你的 API 伺服器應該解密和驗證
aud
聲明和其他與權限相關的聲明以保護 API 請求。 - 每個訪問令牌對應於單一資源。如果你有多個使用不同 URI 註冊的 API 資源,請為每個資源請求不同的訪問令牌。
🤔 但是如果客戶端在請求訪問令牌時沒有指定資源怎麼辦?
不透明訪問令牌
在 Logto 的情況下,如果在請求訪問令牌時未指定資源指標,授權伺服器會假設它是給 OIDC /userinfo
端點的,因此將發出不透明訪問令牌,客戶端可以稍後使用它從 OIDC userinfo 端點請求用戶 ID、姓名、電子郵件等用戶資料。
在任何 Logto SDK 中,如果你呼叫 getAccessToken()
或直接請求 OIDC 令牌端點而不指定 resource
參數,你可以獲得這樣的令牌。
請注意,這個不透明訪問令牌不適用於你自己的 API 資源請求,因為如果不請求 OIDC 伺服器,無法驗證它。
總結
OIDC 資源定義了客戶端應用程式想要代表用戶訪問的特定數據或服務,JWT 訪問令牌作為安全訪問這些資源的手段。JWT 訪問令牌中的 "aud" 聲明與資源指標對齊,幫助伺服器在客戶端請求時驗證權限。
在 Logto 中,不透明訪問令牌僅用於從 OIDC userinfo 端點獲取用戶資料,而客戶端可以請求多個訪問令牌,每個專用於特定資源。
希望這篇博客文章能清除任何疑惑並為你連接點滴。歡迎隨時告訴我們你的想法。