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 反馈 — 无需本地设置。
此课程中的所有课时
- OAuth 2.0 流程与令牌类型
- PKCE:保护公共客户端
- OpenID Connect 声明与 ID 令牌
- OAuth 漏洞与攻击模式