繁體中文(台灣)
  • oidc
  • oauth
  • api resource
  • jwt
  • access token
  • opaque token

連結點滴:深入探索 OIDC 資源與你的 JWT 存取權杖

這篇部落格文章旨在闡明 OIDC 資源指標與其在獲取存取權杖中的角色之間的關係。

Charles
Charles
Developer

背景

先前的一次討論,我們介紹了 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 網頁權杖) 格式的存取權杖僅在訪問權杖請求期間指定 "資源" 參數時才會發行,它攜帶了一組主張,這些主張可以被解密和驗證,例如,確保權杖的完整性和用戶的權限。

這個 "資源" 然後成為 JWT 中的 aud 權杖主張之一,表示權杖的預期受眾。參見 RFC-7519

所以,關係變得清晰:

  • 在請求 JWT 權杖時指定資源指標。
  • 資源指標與 aud 權杖主張對齊。
  • 在發送 API 請求時,JWT 存取權杖必須作為承載權杖標頭包括在內。你的 API 伺服器應該解密並驗證 aud 主張和其他與權限相關的主張,以確保 API 請求安全。
  • 每個存取權杖對應於單個資源。如果你註冊了具有不同 URI 的多個 API 資源,請為每個資源請求不同的存取權杖。

🤔 但是如果客戶端在請求存取權杖時未指定資源怎麼辦?

不透明存取權杖

在 Logto 的情況下,如果在請求存取權杖時未指定資源指標,授權伺服器則假定此為 OIDC /userinfo 端點,因此會發行一個不透明存取權杖,客戶端可以稍後使用這個權杖從 OIDC 用戶資訊端點請求用戶資訊,比如用戶 ID、姓名、電子郵件等。

在任何 Logto SDK 中,你可以通過呼叫 getAccessToken() 或直接向 OIDC 權杖端點請求而不指定 resource 參數來獲取這樣的權杖。

需要注意的是,這個不透明存取權杖不適合你自己的 API 資源請求,因為沒有辦法在不請求 OIDC 伺服器的情況下驗證它。

總結

OIDC 資源定義了客戶端應用程式希望代表用戶訪問的特定數據或服務,JWT 存取權杖作為這一訪問的安全方式。JWT 存取權杖中的 "aud" 主張與資源指標對齊,幫助伺服器在客戶請求時驗證權限。

在 Logto 中,不透明存取權杖僅用於從 OIDC 用戶資訊端點獲取用戶資訊,而客戶端可以請求多個存取權杖,每個存取權杖專用於一個特定資源。

我們希望這篇博文能夠清除任何疑惑並聯繫你所知的點滴。隨時讓我們知道你的想法。