繁體中文(香港)
  • oidc
  • oauth
  • api resource
  • jwt
  • access token
  • opaque token

連接點滴:深入探索 OIDC 資源與你的 JWT 訪問令牌

這篇博客文章旨在揭示 OIDC 資源指標與其在獲取訪問令牌過程中的角色之間的關係。

Charles
Charles
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

背景

之前的一個會議中,我們介紹了 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 端點獲取用戶資料,而客戶端可以請求多個訪問令牌,每個專用於特定資源。

希望這篇博客文章能清除任何疑惑並為你連接點滴。歡迎隨時告訴我們你的想法。