ID Token 是 OpenID Connect 中由 OIDC IdP 签发给客户端的身份声明,通常以 JWT 表示,用来证明“某个用户已经在某个 issuer 处完成认证”。
核心问题
OIDC 客户端需要一种可离线验证的材料来确认登录结果,而不是每次都回到 IdP 查会话。ID Token 把用户标识、签发者、接收方、过期时间和登录上下文放入一个被 IdP 签名的 token 中,让客户端可以本地验证。
核心机制
ID Token 常见声明包括:
| Claim | 含义 |
|---|---|
iss | issuer,签发这个 token 的 IdP |
sub | subject,用户在该 issuer 下的稳定唯一 ID |
aud | audience,预期接收方,通常是 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这些检查分别解决来源可信、签发者匹配、接收方匹配、时效有效和登录请求未被串换的问题。
工程用途
- 管理后台读取
sub或email建立登录用户。 - 首次登录时做 JIT Provisioning(即时用户开通) 或待审批准入。
- 平台日志记录“哪个主体登录了”。
- 把登录状态与本地 session 绑定,而不是在平台内保存用户密码。
边界与常见坑
- ID Token 不是 access token:不要把它发给业务 API 当访问凭据。
sub比邮箱更适合做主键:邮箱可能改名、复用或被大小写规则影响。- 只解码不验签没有安全意义:攻击者可以伪造看起来像 JSON 的 token。
aud必须检查:否则发给别的客户端的 ID Token 可能被拿来登录你的系统。- 过期不等于撤销检查:短有效期、会话检查和 IdP 侧禁用策略需要配合设计。