becomer 458e13b807
ci/woodpecker/tag/build Pipeline was successful
CAS 回调遇「参数解码错误」自动重取盐重试,覆盖 DK 轮换窗口
多个无凭证实验已确认:
- /api/sec_js 的 DK 盐每次请求都不同,且与会话无关(同 cookie 两次也不同);
- 服务端只能从密文里还原 DK,不依赖任何会话状态;
- 用当次 sec_js 加密的密文,服务端必定能解开(返回「用户名或密码错误」而非解码错误);
- 无/无效 CASTGC 时 CAS 直接返回 200+登录页(Set-Cookie 清除 CASTGC),
  根本不会给出 ticket——所以「参数解码错误」发生时 ticket 是有效的,
  失败只可能发生在 /cas/callback 的解密环节。

由此推论:取盐与提交之间若服务端轮换了 DK,就会解密失败。
官方前端对该错误的提示正是「刷新页面后尝试」,说明官方也视其为可重试的
瞬时问题,而非致命错误。

改动:
- 新增 isXsgzDecodeError:仅当响应体含「参数解码错误」时为真
  (凭证错误、ticket 无效等不触发重试);
- 命中时重新拉取 sec_js、重新加密、重新提交一次。

安全性:解码失败意味着服务端没解出内容,ticket 未被消费,
因此重试不会浪费这张一次性 ticket。

日志:重试时记录 dkChanged(两次盐是否不同),
可据此确认线上是否真的发生了轮换,为后续是否加重试次数提供依据。
2026-10-18 17:18:14 +08:00
S
Description
No description provided
6.6 MiB
Languages
Go 58.2%
Vue 35.3%
TypeScript 4.1%
CSS 1.5%
JavaScript 0.6%
Other 0.2%