简体中文
  • oidc
  • openid connect
  • oauth
  • authentication
  • authorization

什么是 OIDC:从我们为何需要它到它如何工作

了解什么是 OIDC,它为何需要,以及它如何工作。了解 OIDC 如何扩展 OAuth 2.0 用于身份验证,理解其核心组件,包括 ID 令牌、范围和用户信息端点。

Yijun
Yijun
Developer

不要在用户认证上浪费数周时间
使用 Logto 更快地发布安全应用。几分钟内集成用户认证,专注于您的核心产品。
立即开始
Product screenshot

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 (签发者):颁发 ID 令牌的 OpenID 提供者的唯一标识符
  • sub (主题):用户的唯一标识符
  • aud (受众):接收 ID 令牌的客户端应用的标识符
  • exp (过期时间):ID 令牌过期时间
  • iat (签发时间):ID 令牌的签发时间

有关 ID 令牌的详细信息,请参阅:ID 令牌

用户信息端点

用户信息端点是 OP 提供的标准化 HTTP API 用于获取经过身份验证的用户详细信息。通过使用访问令牌向该端点发送 GET 或 POST 请求,可以接收到 JSON 格式的用户信息。 返回的数据包括标准化字段,如唯一用户 ID (sub)、用户名 (name)、邮箱和头像。

获取用户信息的过程与在 OAuth 2.0 中访问受保护资源的模式相同。通常,从用户信息端点获取的用户信息比 ID 令牌中获取的更全面,因为 ID 令牌主要用于身份认证和基本用户信息。

有关用户信息端点的详细信息,请参阅:用户信息端点

请注意,从用户信息端点接收到的用户信息取决于在授权期间请求的范围和权限。

OIDC 中的范围

OIDC 中的范围定义了 RP 可以访问的用户信息。OIDC 定义了标准范围,其中 openid 范围在 OIDC 认证流程中是强制性的。

常见的标准范围包括:

  • openid: 表示 OIDC 身份验证请求
  • profile: 基本用户信息,如姓名和头像
  • email: 用户的邮箱信息
  • phone: 用户的电话号码
  • address: 用户的地址信息

不同的范围返回不同的用户信息。例如,请求 openid profile email 返回 ID 令牌和用户信息中的基本用户信息和邮箱,而 openid profile email phone address 包括电话号码和地址信息。

基于 OIDC 的身份管理

OIDC 不仅仅是一个身份认证协议;它是一个构建灵活、可扩展的身份管理系统的强大工具。通过为 OAuth 2.0 添加认证层、标准化用户信息资源,并为扩展的身份管理功能奠定了基础,OIDC 启用了各种身份管理场景:

  • 单点登录 (SSO): OIDC 自然支持通过扩展用户会话信息实现的 SSO,启用统一的登录状态管理和跨应用的身份共享
  • 组织结构管理:扩展的用户组织信息可以管理复杂的组织结构,包括部门层次和用户组关系
  • 权限管理:扩展的用户权限属性可以实现细粒度的资源访问控制,包括角色信息和权限策略配置

OIDC 的灵活性适应不断发展的身份管理需求。许多身份管理系统都是基于 OIDC 构建的,例如 Logto,提供 SSO、组织管理和权限管理功能。