繁體中文(香港)
  • oidc
  • openid connect
  • oauth
  • authentication
  • authorization

OIDC 是什麼:從為什麼我們需要它到它如何運作

了解 OIDC 是什麼,為什麼需要它,以及它如何運作。發現 OIDC 如何擴展 OAuth 2.0 進行身份驗證,了解其核心組成部分,包括 ID Tokens、範圍和 userinfo 端點。

Yijun
Yijun
Developer

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、組織管理和權限管理功能。