0Pricing
Cryptology Academy · 课时

OpenID Connect 声明与 ID 令牌

解码基于 JWT 的 ID 令牌,了解声明验证,并正确实现 OIDC。

OpenID Connect 声明与 ID 令牌 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。

OIDC 作为身份层

OpenID Connect(OIDC)在 OAuth 2.0 之上增加了身份层。OAuth 2.0 处理授权问题(此应用可以访问什么?),而 OIDC 回答身份问题(用户是谁?)。OIDC 的实现方式是在 OAuth 2.0 请求中添加 "openid" 作用域,这会使授权服务器在返回访问令牌的同时返回 ID 令牌。

ID 令牌即 JWT

OIDC ID 令牌是一个 JSON Web 令牌(JWT),其中包含经过身份验证的用户的声明。JWT 由授权服务器使用其私钥签名(通常使用 RS256 或 ES256),而依赖方(客户端应用)使用授权服务器发布的公钥(JWKS 端点)验证签名。

标准 ID 令牌声明

必需且常用的 ID 令牌声明:"sub"(主体,用户唯一标识符)、"iss"(签发者,授权服务器 URL)、"aud"(受众,客户端 ID)、"exp"(过期时间 Unix 时间戳)、"iat"(签发时间 Unix 时间戳)。可选声明:"auth_time"(身份验证发生的时间)、"nonce"(防止重放)、"at_hash"(访问令牌的哈希值)、"acr"(身份验证上下文类)、"amr"(使用的身份验证方法)。

UserInfo 端点

使用有效的访问令牌调用 OIDC UserInfo 端点时,它会返回经过身份验证的用户的其他声明。客户端通过作用域请求特定的声明集合:"profile"(姓名、头像、本地化区域)、"email"(电子邮件、email_verified)、"address"(格式化地址)、"phone"(电话号码、phone_number_verified)。UserInfo 响应可以是 JSON 对象或 JWT。

验证 ID 令牌:签名

ID 令牌验证从签名验证开始。客户端从已知端点获取授权服务器的 JWKS(JSON Web 密钥集),找到与 JWT 标头中 "kid"(密钥 ID)参数匹配的密钥,然后验证 JWT 签名。这可以证明令牌由合法的授权服务器签发且未被篡改。

验证声明:iss、aud、exp

完成签名验证后,客户端必须验证:"iss" 必须与预期的授权服务器 URL 完全匹配(包括方案和路径);"aud" 必须包含客户端自己的 client_id;"exp" 必须是未来的时间(拒绝已过期的令牌);"iat" 应当是合理的近期时间。根据 OIDC 规范,这四项检查都是必需的。

使用 nonce 防止重放

nonce 声明可以防止 ID 令牌重放攻击。客户端生成随机 nonce,并将其包含在授权请求中。授权服务器将 nonce 嵌入 ID 令牌。客户端验证 ID 令牌中的 nonce 是否与自己发送的值匹配。这样可以防止截获 ID 令牌的攻击者将其重放到另一个会话中进行身份验证。

隐式流程 ID 令牌的弱点

当 OIDC 使用隐式流程(response_type=id_token)时,ID 令牌会直接返回在 URL 片段中。客户端必须验证 at_hash(访问令牌的哈希值),以便将访问令牌绑定到 ID 令牌。没有 at_hash 验证,就可能发生访问令牌替换攻击。这也是隐式流程被弃用的另一个原因。

OIDC 作用域和声明

OIDC 定义了标准的作用域到声明的映射。"openid" 作用域是必需的,并返回 "sub" 声明。"profile" 返回 name、given_name、family_name、nickname、picture、website、locale、zoneinfo、updated_at。"email" 返回 email 和 email_verified。请求不必要的作用域违反最小披露原则,并可能暴露敏感的用户数据。

恶意提供商导致的声明注入

实现 OIDC 多提供商登录时(例如“使用 Google 登录”和“使用 GitHub 登录”),可能发生声明注入攻击。如果攻击者在提供商 B 上创建账户,并使用提供商 A 用户的电子邮件地址,那么当应用仅根据电子邮件声明匹配账户时,攻击者可能获得访问权限。始终根据 (iss, sub) 对匹配账户,而不要仅根据电子邮件地址匹配。

混合流程的使用场景

OIDC 混合流程(response_type=code id_token)会从授权端点同时返回授权码和 ID 令牌。ID 令牌允许立即验证身份,而代码则通过后通道交换令牌。当客户端需要在完成后通道令牌交换之前立即呈现用户信息时,可以使用此流程。

ID 令牌验证检查

依赖方必须验证 OIDC ID 令牌中的哪些声明组合?

课程回顾:OIDC 声明和 ID 令牌

OIDC 在 OAuth 2.0 流程中加入了经过签名的 JWT ID 令牌。请验证签名(JWKS)、iss(完全匹配)、aud(client_id)、exp(未过期)以及 nonce(如果已发送)。UserInfo 端点通过作用域提供其他声明。应根据 (iss, sub) 对匹配账户,绝不能仅根据电子邮件地址匹配,以防止声明注入。隐式流程已弃用;在 OIDC 中应使用带 PKCE 的授权码流程。

常见问题解答

「OpenID Connect 声明与 ID 令牌」课时是免费的吗?

是的 — 「OpenID Connect 声明与 ID 令牌」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。

「OpenID Connect 声明与 ID 令牌」这节课中我会学到什么?

解码基于 JWT 的 ID 令牌,了解声明验证,并正确实现 OIDC。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cryptology Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「OpenID Connect 声明与 ID 令牌」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cryptology Academy 课中编写并运行代码吗?

能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. OAuth 2.0 流程与令牌类型
  2. PKCE:保护公共客户端
  3. OpenID Connect 声明与 ID 令牌
  4. OAuth 漏洞与攻击模式
← 返回 Cryptology Academy