什麼是 OIDC:從為什麼需要它到它如何運作
了解 OIDC 是什麼,為什麼需要它,以及它是如何運作的。發現 OIDC 如何擴展 OAuth 2.0 進行身份驗證,了解其核心組件,包括 ID Token、範疇和 userinfo 端點。
了解 OIDC 是什麼,為什麼需要它,以及它是如何運作的。發現 OIDC 如何擴展 OAuth 2.0 進行身份驗證,了解其核心組件,包括 ID Token、範疇和 userinfo 端點。
OpenID Connect (OIDC) 是一個構建在 OAuth 2.0 之上的身份認證協議。雖然 OAuth 2.0 只提供授權功能,但 OIDC 增加了身份驗證功能,為用戶授權和身份驗證場景提供了一個更標準化的解決方案。
簡單來說:OIDC = 授權協議 + 身份認證。
為了理解為什麼需要 OIDC,我們首先來探索 OAuth 2.0 的核心概念和工作流程,以及其在實際應用中的局限性。通過分析具體場景,我們將看到為什麼我們需要 OIDC 而不是僅僅依賴 OAuth 2.0。
OAuth 2.0 (Open Authorization) 是一種授權協議,允許用戶在不分享其憑證(如用戶名和密碼)的情況下,將資源訪問權限授予第三方應用。它涉及四個主要角色:
一個典型的 OAuth 2.0 授權流程如下所示:
如圖所示,OAuth 2.0 主要處理為第三方客戶端發放訪問令牌以訪問用戶資源。
OAuth 2.0 協議只專注於發放訪問令牌。資源伺服器驗證這些令牌並返回授權的資源。然而,資源伺服器並不知道用戶的身份。
這在早期的互聯網生態中並不是一個顯著問題。
然而,隨著像 Google、Facebook、Twitter 和 Github 這樣的平台發展起來,它們開始提供豐富的用戶資源,對第三方應用變得有價值。
雖然 OAuth 2.0 在授權第三方訪問用戶資源方面表現出色,但它也有其局限性。一個典型場景是:由於用戶信息也是一種資源,當第三方應用需要訪問基本的用戶信息時,不同的平台(如 Google、Facebook、Twitter)以不同的格式返回用戶信息,這對開發者來說是一個挑戰。
OIDC 就是為了解決這些挑戰而創建的。
為了在 OAuth 2.0 之上啟用用戶身份驗證並解決其局限性,OIDC 引入了三個角色:
OP 是核心角色,提供 OAuth 2.0 的授權功能,並將用戶信息作為一個單獨的資源處理。
OIDC 的身份驗證過程類似於 OAuth 2.0,但由於 OP 結合了授權伺服器和資源伺服器的角色,它返回訪問令牌和 ID 令牌。ID 令牌包含用戶身份信息,RP 可以通過驗證 ID 令牌來驗證用戶身份。
一個典型的工作流程如下:
這標準化了跨不同平台獲取用戶信息的方式,消除了第三方應用需要處理平台差異的需求。
當用戶授權第三方應用時,OP 返回 OAuth 2.0 訪問令牌和 JWT 格式的 ID 令牌。這個 ID 令牌包含用戶身份信息,如用戶 ID、用戶名、電子郵件和頭像。RP 可以通過驗證 ID 令牌來確認用戶的身份。
作為 JWT,ID 令牌包含標準的聲明,包括以下必需的核心聲明:
iss (發行者):發行 ID 令牌的 OpenID 提供方的唯一標識符sub (主題):用戶的唯一標識符aud (受眾):接收 ID 令牌的客戶端應用標識符exp (過期時間):ID 令牌過期的時間iat (簽發時間):ID 令牌的簽發時間有關 ID 令牌的詳細信息,請參閱:ID 令牌。
UserInfo 端點是一個由 OP 提供的標準化 HTTP API,用於獲取已驗證的用戶詳細信息。通過向這個端點發送帶有訪問令牌的 GET 或 POST 請求,你可以以 JSON 格式接收用戶信息。返回的數據包括標準化的字段,如唯一用戶 ID (sub)、用戶名 (name)、電子郵件和頭像。
獲取用戶信息的過程遵循與在 OAuth 2.0 中訪問受保護資源相同的模式。通常,從 userinfo 端點獲得的用戶信息比 ID 令牌中包含的更加全面,因為 ID 令牌主要用於身份驗證和基本用戶信息。
有關 Userinfo 端點的詳細信息,請參閱:Userinfo 端點。
請注意,從 userinfo 端點接收的用戶信息取決於授權過程中請求的範疇和授予的權限。
OIDC 中的範疇定義了 RP 可以訪問哪些用戶信息。OIDC 定義了標準範疇,其中 openid 範疇在 OIDC 認證流程中是必需的。
常見的標準範疇包括:
openid:表示 OIDC 驗證請求profile:基本用戶信息,如名字和頭像email:用戶的電子郵件信息phone:用戶的電話號碼address:用戶的地址信息不同的範疇返回不同的用戶信息。例如,請求 openid profile email 會在 ID 令牌和 Userinfo 中返回基本的用戶信息和電子郵件,而 openid profile email phone address 則包括電話號碼和地址信息。
OIDC 不僅僅是一個身份驗證協議;它是用於構建靈活、可擴展的身份管理系統的強大工具。通過為 OAuth 2.0 添加身份驗證層,標準化用戶信息資源,併為擴展的身份管理功能奠定基礎,OIDC 支援各種身份管理場景:
OIDC 的靈活性能夠適應不斷變化的身份管理需求。許多身份管理系統都是基於 OIDC 構建的,例如 Logto,提供了 SSO、組織管理和權限管理功能。