OpenID Connect(OIDC)
在 OAuth 之上添加身份功能。
OpenID Connect(OIDC) 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
OIDC 的由来
OpenID Connect 是构建在 OAuth 2.0 之上的轻量身份层。OAuth 回答的是此应用可以做什么;OIDC 回答的是用户是谁。
- 它标准化了客户端如何对用户进行身份验证,以及如何接收经过验证的身份声明。
- 它引入了 ID 令牌,作为经密码学签名的身份验证断言。
在 OIDC 出现之前,开发者常误将 OAuth 访问令牌用于登录,从而导致混淆代理和身份冒充漏洞。
ID 令牌(JWT)
OIDC 的核心产物是ID 令牌,这是一种描述身份验证事件并经过签名的 JWT。
- 它携带关于谁登录以及何时登录的声明。
- 它供客户端使用,而不是供资源服务器使用。
切勿将 ID 令牌作为访问凭据发送给 API,也不要在未验证其签名和声明的情况下接受它。
Header.Payload.Signature
{
"iss": "https://idp.example",
"sub": "248289761001",
"aud": "app123",
"exp": 1718000000,
"iat": 1717996400,
"nonce": "n-abc"
}ID 令牌的核心声明
验证 ID 令牌意味着检查特定声明,而不仅仅是检查签名。
- iss 签发者必须与预期的 IdP 匹配。
- aud 受众必须包含您的 client_id。
- exp / iat 令牌必须尚未过期,且签发时间不能过久。
- sub 稳定且唯一的用户标识符。
- nonce 必须与客户端发送的值匹配。
OIDC 身份验证流程
OIDC 重用授权码流程,但会添加 openid 作用域和一个 nonce。
- 客户端请求
openid作用域(以及可选的profile、email)。 - 令牌端点会在返回访问令牌的同时返回 ID 令牌。
nonce将 ID 令牌与原始请求关联起来,从而防止重放。
GET /authorize?response_type=code
&scope=openid profile email
&client_id=app123
&redirect_uri=https://app.example/cb
&state=xyz&nonce=n-abc使用 JWKS 验证签名
OIDC 提供方会在 JWKS 端点发布其签名密钥,可以通过众所周知的配置文档发现该端点。
- 从
jwks_uri获取密钥,并匹配令牌的kid标头。 - 使用列出的非对称算法(RS256、ES256)进行验证。
拒绝 none 算法,绝不要信任仅由令牌提供的算法值。
GET /.well-known/openid-configuration
-> { "jwks_uri": "https://idp.example/jwks", ... }
GET /jwks
-> { "keys": [ { "kid": "k1", "kty": "RSA", ... } ] }nonce 防御重放攻击
对于 ID 令牌而言,nonce 的作用就像重定向中的 state:它是一个将响应绑定到请求的一次性值。
- 客户端生成一个随机 nonce,并将其存储在会话中。
- IdP 将其写入 ID 令牌并返回。
- 收到令牌后,客户端验证 nonce 是否匹配且之前未被使用。
这样可以阻止令牌重放,以及将为其他会话签发的令牌注入当前会话。
UserInfo 端点
对于 ID 令牌之外的其他个人资料数据,OIDC 定义了 UserInfo 端点。
- 客户端使用访问令牌调用该端点,而不是使用 ID 令牌。
- 该端点会为经过身份验证的主体返回姓名、电子邮件和图片等声明。
始终将返回的 sub 与 ID 令牌中的 sub 进行匹配,以防止声明替换。
GET /userinfo
Authorization: Bearer <access_token>
-> { "sub": "248289761001", "email": "u@example.com" }发现与元数据
OIDC 将发现标准化,使客户端可以自动配置端点和受支持的功能。
/.well-known/openid-configuration文档会列出端点、受支持的作用域和算法。- 请固定或验证签发者;不要盲目跟随由攻击者控制的主机提供的发现信息。
发现机制简化了集成,但签发者仍是必须验证的信任锚点。
前端通道与后端通道注销
联合应用之间的会话终止由 OIDC 注销规范处理。
- 前端通道注销使用浏览器重定向或内嵌框架来清除每个信赖方的会话。
- 后端通道注销发送服务器到服务器的注销令牌,可靠性更高,但需要相应端点。
如果没有协调注销,用户可能已经从一个应用退出,却仍保持对其他应用的登录状态,这会带来实际的会话管理风险。
常见 OIDC 陷阱
身份相关漏洞往往源于跳过验证步骤。
- 接受未检查 aud 的令牌(令牌可能是为另一个客户端准备的)。
- 忽略 iss,从而允许伪造 IdP。
- 不验证签名,或接受
alg: none。 - 混淆 ID 令牌和访问令牌。
- 缺少 nonce 检查,从而允许重放。
Validation checklist:
[ ] iss == expected
[ ] aud contains client_id
[ ] exp not passed, iat sane
[ ] signature verified via JWKS
[ ] nonce matches sessionOIDC 与纯 OAuth 登录对比
如果您的目标是登录,请使用 OIDC,而不是原始 OAuth。
- 对于客户端而言,OAuth 访问令牌是不透明的,无法证明任何身份信息。
- 访问令牌可能对另一个用户或应用有效;如果将其用于登录,就可能导致身份冒充。
- OIDC ID 令牌是明确绑定受众的身份断言。
这一差异可以防止经典的混淆代理身份验证缺陷。
快速检查:ID 令牌验证
对于使用 ID 令牌的信赖方而言,请选择最关键的验证步骤。
回顾:OpenID Connect
要点:
- OIDC 在 OAuth 2.0 之上添加了身份层;ID 令牌是证明身份验证的签名 JWT。
- 始终验证 iss、aud、exp、签名(通过 JWKS)和 nonce。
- ID 令牌供客户端使用;访问令牌供 API 使用;绝不要混淆二者的用途。
- 使用
nonce防止重放,使用state防止 CSRF。 - 需要对用户进行身份验证时,请使用 OIDC,而不是原始 OAuth。
常见问题解答
「OpenID Connect(OIDC)」课时是免费的吗?
是的 — 「OpenID Connect(OIDC)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「OpenID Connect(OIDC)」这节课中我会学到什么?
在 OAuth 之上添加身份功能。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「OpenID Connect(OIDC)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- OAuth 2.0 流程
- OpenID Connect(OIDC)
- SAML 与联合身份
- 令牌攻击与强化