前一天把 algorithm-cli 的登录态收进独立 Chrome Profile 后,冒出一个诱人的想法:能不能把 IdP 签发的 TGC 搬到一个全新的浏览器 context 里复用,省掉每次都启动那个笨重的有头浏览器?结果——搬过去就不工作了。这份报告记录我们如何用控制变量法定位到真正的原因:CAS 在校验 TGC 时至少绑定了 User-Agent。
User-Agent 和 Cookie)与注释。两个实验只差一个 UA,对照着看最清楚。前一天已经确认:TGC(Ticket Granting Cookie)是 IdP 域上的 SSO 会话凭据,ST(Service Ticket)是 IdP 给某个业务系统签发的一次性票据。问题是:TGC 到底是不是"一颗 cookie 走天下"?如果它在任意浏览器里都能换出 ST,那我们就能把它抽出来复用;如果不行,那它必然还绑定了签发时的某些请求特征。本实验就是来回答"TGC 绑不绑定、绑定什么"。
要判断"TGC 是否绑定 UA",最干净的办法是控制变量:把所有可能影响 CAS 校验的因素都固定下来,只翻转 User-Agent 一个变量,观察结果是否随之翻转。如果结果翻转,就说明 UA 确实影响校验;如果不变,则 UA 至少不是决定性因素。
service= 参数指向同一个回调 URL。Chrome/150(与签发时不一致)。Chrome/130(与 LogosCowork 签发时一致)。| 结果 | CAS 的行为 | 说明 |
|---|---|---|
| 认可 | 识别 TGC 有效 → 签发 ST → 302 回业务系统 | TGC 在该 UA 下可用 |
| 不认可 | 不签发 ST → 返回登录页(200) | TGC 在该 UA 下不可用 |
两个实验的 UA 只差一个版本号。如果 A 被拒、B 通过,且其余变量全同,则"UA 是否一致"是唯一能解释结果翻转的因素。
把 LogosCowork 签发的 TGC 放进全新 context,只把 User-Agent 改成 Chrome/150(与签发时的 Chrome/130 不一致),然后访问受保护的业务系统。点 ▶ 看完整链路。
User-Agent 与签发时不一致,没有签发 ST,直接返回登录页。TGC 在这个 UA 下不可用。注意:被拒不是 401 / 403,而是返回登录页——CAS 的态度是"我不认识这枚 TGC 的持有环境,请你重新登录"。同一枚 TGC、同一个全新 context、同一个 service、同一个重定向地址,唯一区别是把 User-Agent 改回 Chrome/130(和 LogosCowork 签发时一致)。点 ▶ 看链路如何一路走通。
Chrome/130,CAS 立即签发 ST,业务系统验证 ST 后建立本地 session,登录成功。| 变量 | 实验 A | 实验 B |
|---|---|---|
| TGC | 同一枚(LogosCowork 签发) | |
| 目标 service | 同一个 | |
| 重定向地址 | 同一个 | |
| 浏览器 context | 全新、仅含该 TGC | |
| User-Agent | Chrome/150 | Chrome/130 |
| CAS 是否签发 ST | 否 · 返回登录页 | 是 · 签发 ST |
结果翻转了:唯一变量是 UA,A 被拒、B 通过。所以可以下结论——
控制变量法能证明"某因子有影响",但无法穷举"还有哪些因子也有影响"。这是单次实验固有的边界,也是下一章"三层事实"要区分清楚的重点。
既然 TGC 绑定签发时的环境特征(至少含 UA),最稳妥的做法不是把 TGC 抽出来到处搬,而是始终在签发它的那个专用 Chrome profile 内完成后续 CAS 导航——这样 UA、环境特征天然一致,CAS 会顺畅地用 TGC 换出 ST。
window.cowork.mcp.harvestCookies("sre.temu.team/event") 取业务 Cookie。TGC 始终留在签发它的 profile 里,由那个环境自己完成 CAS 换 ST、换业务 session,我们只拿最终的业务会话 Cookie(如 baizeSessionId)。
| 维度 | 旧方案 | 新方案(原生 harvest) |
|---|---|---|
| Cookie 来源 | 读 9278 ChromeDebug Profile / page.cookies() | CDP 连 9277 主渲染页,执行 harvestCookies() |
| TGC 归属 | 尝试把登录态抽离到独立 context | TGC 留在签发 profile,由其完成 CAS 导航 |
| 缓存与失效 | 每次开可见页面刷新 | 内存缓存;401 / 403 强制重 harvest,只重试一次 |
| 回退路径 | 保留 algo login / 9278 / ChromeDebug | 删尽回退,只留一条 harvest 链路 |
| 用户感知 | 常弹可见 Chrome 窗口、抢焦点 | 无头、不开窗口、不打断 |
harvestCookies 也能取 PAI(tech.temu.team/pai)的登录态,本地 Jupyter Kernel 代理链路因此连通。一份机制,覆盖 SRE 告警与 PAI 两条业务线。algo login 兜底。认证这种话题最容易把"协议规定的""某实现做的""我们推测的"搅在一起。为了避免以讹传讹,把本报告涉及的所有结论按依据强度分进三层——哪一层都不要冒充更高层。
| 层级 | 结论 | 依据 | 强度 |
|---|---|---|---|
| 公开事实 | TGC 是 IdP 域上的 SSO 会话凭据;ST 是一次性、绑定 service 的票据,业务系统验证 ST 后建立自己的本地 session。 |
CAS 协议规范 + 通用 SSO 常识 | 高 · 跨实现通用 |
| 协议事实 | CAS 协议本身不要求 TGC 绑定 User-Agent。"是否绑定 UA / IP / 设备"是各实现的安全策略选择,协议层留白。 | CAS 协议规范 | 高 · 协议层确定 |
| 工程推断 | 本实验观察到 Temu 内部 CAS 实现校验 TGC 时至少纳入 UA;是否还校验 IP / 设备指纹未知。不可外推到其它 CAS 实现。 | 本次控制变量实验,单一实现 | 中 · 限定单一实现 |