OAuth 开发与调试

OAuth 授权链接与回调参数检查

先用公开示例查看请求与回调的关系,再换成自己的参数。

OAuth 授权链接

请求输入

填写原始值,注册的回调地址会作为参数原样保留。

结果

全部处理在当前浏览器标签页完成,不发送或保存输入。

选项

response_type=code · 授权码流程

保留 verifier 用于令牌请求;只有 S256 挑战进入地址,报告不含 verifier。

额外参数每行一个原始 key=value;不要预编码或重复保留字段。

填写参数或载入示例。

回调地址只差一个端口,或者 state 里的加号被解成空格,都可能让登录流程卡住。OAuth 授权链接检查把完整地址和解码后的参数放在一起,你可以直接看到实际发出的值,而不必在一长串百分号里寻找差异。

已经拿到测试回调时,切换到解析模式,粘贴地址并单独填写当时保存的预期 state。表格不会把重复名称压成一个值,也不会把“解析成功”写成“身份验证成功”。

为什么需要 OAuth 授权链接检查

挑战值进入地址,验证器单独保留

OAuth 授权链接构建会对原始 verifier 做 S256 派生,仅将 challenge 和方法名加入请求。verifier 留在输入框,通过独立按钮复制给后续令牌请求;授权参数表与报告都不包含它,方便分清这两个值的去向。

多个彩色参数汇入地址栏,私有验证器留在旁边,只有派生结果进入地址。

重复的 state 不会被悄悄覆盖

同名 state 可能同时出现在查询串和片段中。这里分别标记来源、保留原次序,即使两个值相同也判为歧义。这样可以看到导致客户端取错值的原始证据。

回调地址拆成查询与片段两列,两个同色参数行被保留并标出重复关系。

先对齐请求,再检查返回值

01

回调地址填写原文

redirect_uri 必须是注册时的完整字符串,端口、路径、尾斜线和已有查询都要核对。不要先编码整个地址;额外参数也按原始 key=value 逐行填写,值中的 & 会被作为内容编码。

02

主动生成同一笔事务的参数

生成按钮为 state 和 verifier 各取 32 个随机字节;scope 包含独立 openid 项时还会更新 nonce。先查看修改字段数再应用,保留本次 verifier。修改权限不会暗中生成另一套随机值。

03

切换运行时机与解析视图

自动模式在停止编辑 350 毫秒后更新;关闭后可点击执行,也可按 Ctrl/Cmd+Enter。结果过期时不能导出。两个视图保留各自输入,回调的预期 state 需要单独提供,避免猜测它属于哪次请求。

把编码与事务参数看清楚

嵌套查询只作为一个参数值

OAuth 授权 URL 里,内层回调的查询不会变成外层参数。已有端点查询先严格解码,再与表单一起编码;额外值中的原始加号写成 %2B,空格使用表单查询编码。

可重复核对的 S256

接受 43–128 个合法字符组成的 verifier,不裁剪空白,也不先做 Base64 解码。关闭 PKCE 只移除输出中的挑战参数,保留输入;语法合法不代表手工字符串有足够随机性。

一次解码并保留来源

支持完整回调 URL、?query、#fragment 和裸查询串。%252F 只解成 %2F,%2B 解成加号,普通 + 解成空格;空值、空键及重复项全部保留,便于定位 OAuth 回调地址里的编码问题。

具体的状态检查结论

缺失、空值、重复、未提供预期值、匹配及不匹配分别显示。code 与 error 混合或存在重复参数时会提示检查;长表先显示 50 行,报告始终导出完整列表。

这里检查什么,边界在哪里

只构建授权码请求
response_type 固定为 code,不支持隐式、混合流程或 plain PKCE。此处填写 nonce 必须同时有 openid scope;它最终应在 ID token 验证时检查,本页不执行该验证。
URI 语法通过不等于已注册
授权端点须为 HTTPS;本地测试允许 localhost、127.0.0.1 与 [::1] 的 HTTP。回调还支持 com.example.app:/cb 这类反向域名私有方案。拒绝用户密码、片段、原始空白和错误转义;是否符合提供商登记规则仍需单独核对。
不允许覆盖保留字段
端点查询和额外参数不能重复名称或覆盖表单管理的字段,也不能放入密钥、verifier、令牌、请求对象或 response_mode。这里的 OAuth2 链接生成器不维护供应商预设,不下载发现文档,不接收 form_post,也不生成 JAR/PAR 请求。
解析止于文本检查
工具不会打开授权地址、接收真实回调或交换令牌。普通锚点与哈希路由不是支持的参数片段。state 匹配只说明文本一致,不证明发行者、会话绑定、签名、时效或授权结果有效。
输入上限与临时状态
构建字段合计最多 32,768 个字符;回调和预期 state 分别遵守该上限,结果最多 100 个参数。不持久保存草稿或历史。示例、随机替换及清空先预览,再应用;一次撤销同时恢复输入和输出。

OAuth 授权链接常见问题

为什么回调 URI 必须精确匹配?

协议、端口、路径或尾斜线的变化可能指向另一个接收端。请在提供商控制台登记实际要用的地址。本页把你的原文作为参数值保留,无法读取服务端的客户端注册配置。

state 和 nonce 有什么区别?

state 随回调返回,用于与这笔事务原先保存的值比较。nonce 通常出现在 ID token 的声明中,需要先验证该令牌再核对。回调参数中出现 nonce,并不等于完成了这项检查。

已经有客户端密钥,还需要 PKCE 吗?

客户端密钥用于令牌端点上的客户端认证;PKCE 将授权码进一步绑定到原始 verifier。当前安全最佳实践也建议机密客户端使用 PKCE。这里默认启用 S256,但仍需确认服务端支持。

client_id 可以公开放在网址里吗?

可以,它是公开标识,不是客户端密钥。client_secret 与 code_verifier 不应进入授权查询串;工具会拦截这些参数名,并为 verifier 提供单独的复制按钮。

OpenID Connect 和 OAuth 有什么区别?

OAuth 负责资源访问授权,OpenID Connect 在其上增加用户认证与 ID token。准备这类请求时,需要在 scope 中加入 openid,并按提供商要求填写 nonce;令牌验证仍由你的应用完成。

发现计算或校验问题?

准备下一次授权请求

用 OAuth 授权链接检查对齐端点和注册配置,再把测试回调与当时保存的 state 放在一起核对。