Summary

  • draft-richer-oauth-oob-authcode-00 面向无法承接浏览器回调的客户端,用客户端保存的 state 把授权码变成一个可复制值;它仍是个人 Internet-Draft,不是 OAuth 工作组成果或 RFC。
  • helper page 用 HKDF、XOR 和三字节 checksum 生成 CC,客户端凭原 state 还原 code,之后仍须向 token endpoint 兑换。
  • checksum 通过只说明本次还原在格式上自洽,不证明传输保密、issuer 正确、PKCE 成功、token 已签发、资源有权访问或业务动作已经发生。

只把人工交接缩成一步

命令行客户端可以让用户在浏览器中打开 authorization URL,却未必能在远程主机上提供浏览器可达的 callback。修订 00 不另造 grant:它把静态 helper page 注册为 redirect_uri,让 authorization server 照常回送 code 和 state,再由用户把 helper 显示的单一字符串贴回等待中的客户端。

helper 没有后端状态,不与客户端预共享秘密,也不向 token endpoint 发请求。authorization server 无须理解这套编码。它解决的是两串值在人手中被混淆或损坏的问题。

因此,页面显示成功、用户复制成功、客户端收到输入,是三张传递回执。它们都不是 token 回执,更不是资源操作结果。

三个字节回答不了“谁”

helper 把授权码编码为 C,以 UTF-8 state 为输入、空 salt 和共同 INFO 运行 HKDF,得到同长度的 KS,再计算 E = C XOR KS。SHA256(C) 的前三个字节成为 T。T 与 E 分别做无 padding 的 base64url 后拼接成 CC。

客户端仍保存原 state。它重建 KS、取回 C、重新计算 T;不一致就失败,长度不超过四个 checksum 字符的输入必须丢弃。随后,客户端才把还原出的 code 送往 token endpoint。

T 不是 authorization server 持有密钥生成的 MAC。任何人都能用公开静态页面处理任意 code 和 state。三字节相等只说明“按这个 state 还原出的字节与短校验一致”,不能证明是谁生成、来自哪个浏览器会话、是否仍在有效期内。

加密运算发生在暴露之后

浏览器请求 helper 时,code 和 state 已经位于 GET 参数中。helper 的源站、CDN、镜像与缓存都可能看到它们。HKDF 和 XOR 随后才在页面里运行。草案明确说,这些运算不会为基础 authorization code grant 增加安全保护,也不会让 code 变成秘密。

如果 code 与 state 一并被盗,CC 无法补救。若客户端没有保存 state,它也无法还原。JavaScript 不可用时,建议 fallback 是复制完整 helper URL;那条路径直接携带两项参数,根本不使用 HKDF。

构造还会丢弃 iss 等其他回调参数。只有在客户端确信 AS 会返回 issuer 时,才可能把它纳入 INFO。于是 issuer 校验必须保留为单独证据,不能被一次粘贴成功遮住。

OAuth 的后半程没有消失

RFC 6749 的 code 绑定、redirect 检查、有效期和 token 兑换仍然存在。使用 PKCE 时,客户端仍需提交与 challenge 对应的 verifier。客户端认证、一次性使用与 RFC 9700 的安全建议,也不会自动进入三字节 checksum。

RFC 8628 的 device authorization grant 是另一种架构:AS 提供 device code,客户端轮询。新草案刻意避免服务器增加 grant 支持。少一些 round trip 可以是工程收益,却不是两种流程安全和恢复能力相同的证据。

Lu Heng 的 Minimum Initial Specification 要求把共同承诺压窄:这里只承诺降低人工抄录错误。Running-Code Primacy 则继续检查客户端到底还原了什么、token endpoint 接受了什么、resource server 最终执行了什么。一个输入框不能把这些现实层合并。

来源与限制

这些来源不证明 OAuth 工作组采纳、IETF 共识、RFC、实现、互操作、部署、登录完成、token 签发、攻击、缓解成效或资源结果。既有 RFC 10027 文章继续拥有“攻击者控制发起设备”的跨设备上下文问题;本文只分析修订 00 在诚实流程里产生的还原回执。