ID Token 是什么
一句话总结
ID Token 是 OIDC 签发的”数字身份证”——一个 JWT 格式的令牌,里面写着你叫什么、邮箱是什么、谁签发的、什么时候过期。SP 读到它就知道你是谁。
🤔 为什么会有它 / 解决了什么问题
OAuth 2.0 的 Access Token 只管”能不能进”,不管”进来的是谁”。OIDC 加了一个 ID Token,专门回答”你是谁”这个问题。两者各司其职:
| ID Token | Access Token | |
|---|---|---|
| 作用 | 证明身份(你是谁) | 授权访问(能干什么) |
| 给谁看 | SP(前端验证) | Resource Server(API) |
| 格式 | JWT,可解码 | 通常是不透明字符串 |
| 包含 | name, email, sub | scopes, permissions |
🔍 具体原理 / 运作逻辑
ID Token 是一个 JWT(JSON Web Token),由 IDP 用密钥签名。Frappe 用 HS256(client_secret 当 HMAC 密钥)签名。
SP 拿到 ID Token 后做三件事:
- 验签:用同样的密钥验证签名,确保没被篡改
- 检查过期:
exp字段必须在未来 - 检查接收方:
aud字段必须是自己的 client_id
一个典型的 Frappe ID Token 解码后长这样:
{
"sub": "user@example.com",
"name": "张三",
"email": "zhangsan@example.com",
"given_name": "三",
"family_name": "张",
"iss": "https://gottenergy.getgrowth.app",
"aud": "grafana-client-id",
"iat": 1752000000,
"exp": 1752003600
}更硬核的技术细节(点击展开)
JWT 结构:
header.payload.signature三段 Base64URL 编码,用.分隔。
- Header:
{"alg": "HS256", "typ": "JWT"}- Payload:上面那些 claims 字段
- Signature:
HMAC-SHA256(base64(header) + "." + base64(payload), client_secret)Frappe 目前只支持 HS256。如果外部应用要求 RS256(非对称加密),需要额外处理或换 IDP。
🧭 什么情况下会用到 / 什么场景会遇到它
- 配置 Grafana OIDC 时,Grafana 就是读 ID Token 来识别用户的
- 调试 SSO 失败时,可以用 jwt.io 解码 ID Token 看里面有什么
🔗 关联 / 经常一起出现的概念
- OIDC:ID Token 是 OIDC 协议的核心产物
- Access Token:ID Token 的兄弟,一个管身份一个管权限
- Authorization Code Flow:ID Token 在这个流程的最后一步被签发
- PKCE:保护 Authorization Code Flow,间接保护 ID Token 不被窃取
⚠️ 注意事项 / 常见误区
- ID Token 不是用来调 API 的,调 API 用 Access Token
- ID Token 里有个人信息,不要在日志里打印全文
- Frappe 签名算法是 HS256,不是所有 SP 都默认支持(有的只认 RS256)
📎 记忆锚点
ID Token = 身份证。上面有你的名字和照片,有公安局的钢印防伪。Access Token = 房卡,没有名字只有权限。
📝 更新日志
| 日期 | 改动 | 原因 |
|---|---|---|
| 2026-07-09 | 首次创建 | Frappe SSO/OIDC 集成准备 |