Authorization Code Flow 是什么
一句话总结
Authorization Code Flow 是 OIDC/OAuth 2.0 里最安全的登录流程。用户点开应用 → 跳转 IDP → 输入密码 → 浏览器拿回一个”临时授权码”→ 后端用这个码去换真正的令牌。多这一步”换码”,就是为了令牌不经过浏览器(防泄露)。
🤔 为什么会有它 / 解决了什么问题
OAuth 早期有个 Implicit Flow:用户登录完,令牌直接通过 URL 传回浏览器。这有两个风险:
- 令牌出现在浏览器历史记录、服务器日志、Referer 头里,到处泄露
- 恶意 JavaScript 可能截获 URL 里的令牌
Authorization Code Flow 的设计就是令牌永远不出现在浏览器 URL 里。用户只拿到一个临时的、一次性授权码,真正的令牌由后端服务器之间交换。
🔍 具体原理 / 运作逻辑
流程分三步,像寄快递:
第一步:你去 SP(打开 Grafana)
SP → 浏览器重定向到 Frappe 登录页
附带参数:client_id, redirect_uri, scope=openid, response_type=code
第二步:你在 IDP 登录(输入密码)
Frappe 验证密码 → 浏览器重定向回 Grafana
URL 里带了一个 ?code=xxx(临时授权码,只能用一次,几分钟过期)
第三步:SP 后端用码换令牌(用户看不到)
Grafana 后端 → POST Frappe 的 /token 接口
附带:code + client_secret + redirect_uri
Frappe 验证一切正确 → 返回 Access Token + ID Token
Grafana 读 ID Token 知道你是谁 → 放行
更硬核的技术细节(点击展开)
为什么安全:
code是临时的,即使从浏览器 URL 泄露,没有client_secret也换不到令牌client_secret只在 SP 后端和 IDP 之间传递,不经过用户浏览器- 加上 PKCE 后,即使
code被截获,没有code_verifier也换不了令牌Frappe 的端点:
- Authorize:
/api/method/frappe.integrations.oauth2.authorize- Token:
/api/method/frappe.integrations.oauth2.get_token
🧭 什么情况下会用到 / 什么场景会遇到它
- 配置任何支持 OIDC 的应用(Grafana、Outline、n8n)都是在配这个流程
- 你登录一个网站后被跳转到 Google 登录页,回来后就登上了——这就是 Auth Code Flow
🔗 关联 / 经常一起出现的概念
- OIDC:Auth Code Flow 是 OIDC 的推荐认证流程
- OAuth 2.0:这个流程是 OAuth 2.0 定义的
- PKCE:Auth Code Flow 的安全升级版
- ID Token:第三步拿到的”身份证”
- Access Token:第三步拿到的”房卡”
⚠️ 注意事项 / 常见误区
redirect_uri必须精确匹配 OAuth Client 里配的值(包括 http vs https),否则 IDP 会拒绝code只能用一次,重放会报错
📎 记忆锚点
你去银行取钱:出示身份证(登录)→ 柜员给你一个号牌(临时授权码)→ 你凭号牌去保险柜取钱(换令牌)。号牌本身不值钱,丢了别人也取不走你的钱。
📝 更新日志
| 日期 | 改动 | 原因 |
|---|---|---|
| 2026-07-09 | 首次创建 | Frappe SSO/OIDC 集成准备 |