JianFeeeee
1be34557dd
fix(trae): 登录失败真因 —— 虚构的「授权码交换」+ 空 client_id
用户报「TRAE 登录后显示失败」。定位到三处偏差,其中一处是核心缺陷:
① ★ **虚构了一次不存在的「授权码交换」**(核心)
poll_login 的 trae 分支自己发明了一段逻辑:回调只带 code 时,拿
exchange_body 去打 ExchangeToken。但:
· ExchangeToken 的签名是 RefreshToken,不是 code;
· exchange_body 里根本没有 {code} 占位符,那次替换是空操作;
· client_id 当时是空串。
于是稳定 400,日志回一句误导性的「Trae 授权码交换失败: 400」——
把真因「上游走了 PKCE 流程」掩盖成「交换出错了」,排查方向完全错。
按参考实现(trae-oauth.ts parseTraeCallbackDetailed)修正:带 code 的
回调是**合法回调**,只是不支持的 PKCE 分支,必须明确报出来。
删除虚构交换,两条路径共用 traeCallback 内建的 PKCE 判定。
② client_id 从空串改为实测真值 en1oxy7wnw8j9n(对齐参考 trae-product.ts
的 clientId;ExchangeToken 请求体里 ClientID 必填,留空稳定 400)。
③ 两条路径(oauth_callback / poll_login)现在共用同一结论,不再漂移 ——
这正是缺陷能藏住的原因:修复只覆盖一条、另一条继续错。
测试支撑:
- 新增 __set_loopback_probe(注入 loopback 回调文件),否则无法驱动
poll_login 的 callback 分支(那才是真实登录走的路径)。
- 判据 4 条,全部做变异验证:
TestTraePkceCallbackIsReportedNotExchanged 打 poll_login,断言没打 ExchangeToken 且点名 PKCE
TestTraeExchangeSendsRealClientID token 直传真调交换,请求体形状正确
TestTraeClientIDIsNotBlank client_id 必须是实测真值
TestTraeCallbackPathsAgreeOnPkce 两条路径必须共用 traeCallback
- 变异 2/2 咬住:client_id 改回空串 → 报红;虚构交换加回去 → 「实际打了 1 次
ExchangeToken」。
★ 我在过程中自己犯的两个错(均由变异测试揭穿,已修正):
1. **判据打错了路径** —— 第一版打 oauth_callback(那条一直是对的),注入缺陷后
判据**仍绿**。改成打 poll_login 才咬住。教训:判据必须打**真实被使用的那条
路径**,否则等于没测。
2. **判据写错了契约** —— poll_login 用 HTTP 200 + json.state 表达终态,我按
status != 200 断言,把正确的实现判成了错。
回归:go test -tags luajit ./... 10 包全绿。
2026-10-15 22:04:01 +08:00
..
2026-10-15 20:30:33 +08:00
2026-10-15 22:04:01 +08:00
2026-10-15 20:30:33 +08:00
2026-10-15 20:30:33 +08:00
2026-10-13 22:51:50 +08:00
2026-10-13 22:34:13 +08:00
2026-10-13 23:42:04 +08:00
2026-10-06 15:02:42 +08:00
2026-10-12 16:37:23 +08:00
2026-10-11 09:23:34 +08:00
2026-10-11 09:23:34 +08:00
2026-10-02 12:41:35 +08:00
2026-10-13 13:42:57 +08:00
2026-10-13 13:42:57 +08:00
2026-10-13 23:42:04 +08:00
2026-10-13 23:28:27 +08:00
2026-10-12 12:32:10 +08:00
2026-10-13 13:42:57 +08:00
2026-10-02 10:45:20 +08:00
2026-10-13 13:42:57 +08:00
2026-10-02 14:07:44 +08:00
2026-10-13 06:57:28 +08:00
2026-10-13 06:57:28 +08:00
2026-10-14 10:55:50 +08:00
2026-10-13 13:42:57 +08:00
2026-10-04 14:50:46 +08:00
2026-10-11 09:35:32 +08:00
2026-10-05 08:17:57 +08:00
2026-10-05 08:17:57 +08:00
2026-10-11 13:25:11 +08:00
2026-10-11 10:03:43 +08:00
2026-10-12 12:32:10 +08:00
2026-10-13 22:28:34 +08:00
2026-10-14 11:31:41 +08:00
2026-10-05 08:17:57 +08:00
2026-10-05 08:17:57 +08:00
2026-10-05 08:17:57 +08:00
2026-10-11 09:35:32 +08:00
2026-10-11 09:35:32 +08:00
2026-10-15 14:57:13 +08:00
2026-10-13 06:57:28 +08:00
2026-10-13 06:57:28 +08:00
2026-10-13 06:57:28 +08:00
2026-10-14 11:31:41 +08:00
2026-10-14 10:46:05 +08:00
2026-10-11 20:50:52 +08:00
2026-10-07 17:37:22 +08:00
2026-10-05 08:17:57 +08:00
2026-10-11 13:25:11 +08:00
2026-10-13 13:42:57 +08:00
2026-10-11 09:35:32 +08:00
2026-10-04 14:50:46 +08:00
2026-10-13 13:42:57 +08:00
2026-10-15 14:57:13 +08:00
2026-10-07 17:37:22 +08:00
2026-10-11 09:35:32 +08:00
2026-10-12 12:32:10 +08:00
2026-10-14 10:46:05 +08:00
2026-10-13 13:42:57 +08:00
2026-10-12 16:32:30 +08:00
2026-10-14 11:31:41 +08:00
2026-10-11 08:17:56 +08:00
2026-10-11 09:35:32 +08:00
2026-10-12 19:07:09 +08:00
2026-10-13 22:34:13 +08:00