ID TokenOpenID Connect 中由 OIDC IdP 签发给客户端的身份声明,通常以 JWT 表示,用来证明“某个用户已经在某个 issuer 处完成认证”。

核心问题

OIDC 客户端需要一种可离线验证的材料来确认登录结果,而不是每次都回到 IdP 查会话。ID Token 把用户标识、签发者、接收方、过期时间和登录上下文放入一个被 IdP 签名的 token 中,让客户端可以本地验证。

核心机制

ID Token 常见声明包括:

Claim含义
ississuer,签发这个 token 的 IdP
subsubject,用户在该 issuer 下的稳定唯一 ID
audaudience,预期接收方,通常是 client id
exp过期时间
iat签发时间
nonce客户端发起登录时生成的随机值,用于绑定请求与响应
email / name可选用户资料,不应作为唯一主键

客户端验收 ID Token 时至少检查:

signature_valid(token, issuer_jwks)
token.iss == configured_issuer
client_id in token.aud
now < token.exp
token.nonce == login_request.nonce

这些检查分别解决来源可信、签发者匹配、接收方匹配、时效有效和登录请求未被串换的问题。

工程用途

  • 管理后台读取 subemail 建立登录用户。
  • 首次登录时做 JIT Provisioning(即时用户开通) 或待审批准入。
  • 平台日志记录“哪个主体登录了”。
  • 把登录状态与本地 session 绑定,而不是在平台内保存用户密码。

边界与常见坑

  • ID Token 不是 access token:不要把它发给业务 API 当访问凭据。
  • sub 比邮箱更适合做主键:邮箱可能改名、复用或被大小写规则影响。
  • 只解码不验签没有安全意义:攻击者可以伪造看起来像 JSON 的 token。
  • aud 必须检查:否则发给别的客户端的 ID Token 可能被拿来登录你的系统。
  • 过期不等于撤销检查:短有效期、会话检查和 IdP 侧禁用策略需要配合设计。

相关术语