OIDC 是什麼:從為什麼我們需要它到它如何運作
了解 OIDC 是什麼,為什麼需要它,以及它如何運作。發現 OIDC 如何擴展 OAuth 2.0 進行身份驗證,了解其核心組成部分,包括 ID Tokens、範圍和 userinfo 端點。
OpenID Connect (OIDC) 定義
OpenID Connect (OIDC) 是一種建立於 OAuth 2.0 之上的身份驗證協議。雖然 OAuth 2.0 僅提供授權,OIDC 增加了身份驗證功能,為用戶授權和身份驗證場景提供更標準化的解決方案。
簡而言之:OIDC = 授權協議 + 身份驗證。
為什麼需要 OIDC?
要了解為什麼需要 OIDC,首先讓我們探索 OAuth 2.0 的核心概念和工作流程,以及在實際應用中的限制。通過分析具體場景,我們將看到為什麼需要超越 OAuth 2.0 使用 OIDC。
OAuth 2.0 的關鍵概念和授權流程
OAuth 2.0(開放授權)是一種授權協議,讓用戶授予第三方應用訪問其資源的權限,而無需共享憑據如用戶名和密碼。它涉及四個主要角色:
- 資源所有者:擁有資源的用戶
- 資源伺服器:存儲用戶資源的伺服器
- 客戶端:要求訪問用戶資源的第三方應用
- 授權伺服器:核實用戶身份並發放訪問令牌的伺服器
一個典型的 OAuth 2.0 授權流程如下所示:
如圖所示,OAuth 2.0 主要處理為第三方客戶端簽發訪問用戶資源的訪問令牌。
OAuth 2.0 的限制
OAuth 2.0 協議僅專注於簽發訪問令牌。資源伺服器驗證這些令牌並返回授權的資源。然而,資源伺服器並不知道用戶的身份。
這在早期的互聯網生態系統中並不是一個顯著的問題。
然而,隨著像 Google、Facebook、Twitter 和 Github 這樣的平台發展,它們開始提供豐富的用戶資源,這些資源對第三方應用變得非常有價值。
雖然 OAuth 2.0 擅長於授權第三方訪問用戶資源,但它有局限性。一個典型的場景是:由於用戶信息也是資源,當第三方應用需要訪問基本用戶信息時,不同平台(如 Google、Facebook、Twitter)會以不同的格式返回用戶信息,給開發者帶來挑戰。
OIDC 是為了應對這些挑戰而創造的。
在 OIDC 中的角色
為了在 OAuth 2.0 之上實現用戶身份驗證並解決其限制,OIDC 引入了三個角色:
- 終端用戶 (EU):最終用戶,對應於 OAuth 2.0 的資源所有者
- 依賴方 (RP):依賴方,對應於 OAuth 2.0 的客戶端
- OpenID 提供者 (OP):身份驗證服務提供者,对應于 OAuth 2.0 的授权伺服器和资源伺服器
OP 是核心角色,提供 OAuth 2.0 的授權功能,並將用戶信息視為單獨的資源。
OIDC 如何運作?
OIDC 的身份驗證過程類似於 OAuth 2.0,但由於 OP 結合了授權伺服器和資源伺服器的角色,它返回訪問令牌和 ID 令牌。ID 令牌包含用戶的身份信息,RP 可以驗證 ID 令牌來證實用戶的身份。
一個典型的工作流程如下所示:
這標準化了跨不同平台獲取用戶信息的方式,使第三方應用無需處理平台特有的差異。
OIDC 中的 ID 令牌(身份令牌)
當用戶授權第三方應用時,OP 返回 OAuth 2.0 的訪問令牌和 JWT 格式的 ID 令牌。這個 ID 令牌包含用戶身份信息,如用戶 ID,用戶名,電郵,和頭像。RP 可以通過驗證 ID 令牌確認用戶的身份。
作為一個 JWT,ID 令牌包含標準化的聲明,包括這些必需的核心聲明:
iss
(Issuer):簽發 ID 令牌的 OpenID 提供者的唯一標識符sub
(Subject):用戶的唯一識別身份aud
(Audience):獲取 ID 令牌的客戶端應用的識別符exp
(Expiration Time):ID 令牌過期的時間iat
(Issued At):ID 令牌簽發的時間
有關 ID 令牌的詳細信息,請參閱:ID 令牌。
Userinfo 端點
UserInfo 端點是由 OP 提供的標準化 HTTP API,用以獲取經身份驗證的用戶詳細信息。通過用訪問令牌發送 GET 或 POST 請求到該端點,可以接收到 JSON 格式的用戶信息。 返回的數據包括標準化的字段,如唯一用戶 ID (sub)、用戶名 (name)、電郵和圖片。
獲取 userinfo 的過程遵循與在 OAuth 2.0 中訪問受保護資源相同的模式。通常,從 userinfo 端點獲得的用戶信息比 ID 令牌中的更全面,因為 ID 令牌主要用於身份驗證和基礎用戶信息。
有關 Userinfo 端點的詳細信息,請參閱:Userinfo 端點。
注意,從 userinfo 端點獲取的用戶信息取決於請求的範圍和授權期間授予的權限。
OIDC 中的範圍
OIDC 中的範圍定義了 RP 可以訪問的用戶信息。OIDC 定義了標準範圍,其中 openid
範圍在 OIDC 認證流中是必須的。
常見的標準範圍包括:
openid
:表示一次 OIDC 認證請求profile
:基本用戶信息,如姓名和頭像email
:用戶的郵件信息phone
:用戶的電話號碼address
:用戶的地址信息
不同的範圍返回不同的用戶信息。例如,請求 openid profile email
會在 ID 令牌和 Userinfo 中返回基本用戶信息和電子郵件,而 openid profile email phone address
則包括電話號碼和地址信息。
基於 OIDC 的身份管理
OIDC 不僅僅是一種身份驗證協議;它是構建靈活、可擴展身份管理系統的強大工具。通過將身份驗證層添加到 OAuth 2.0,標準化用戶信息資源,並為擴展身份管理功能打下基礎,OIDC 推動了多種身份管理場景:
- 單一登入 (SSO):OIDC 通過擴展用戶會話信息自然支持 SSO,實現統一的登錄狀態管理和跨應用的身份共享
- 組織結構管理:擴展的用戶組織信息可以管理複雜的組織結構,包括部門層級和用戶組關係
- 權限管理:擴展的用戶權限屬性支持細粒度的資源訪問控制,包括角色信息和授權政策配置
OIDC 的靈活性適應了不斷演變的身份管理需求。許多身份管理系統都是基於 OIDC 構建的,例如 Logto,提供 SSO、組織管理和權限管理功能。