校园服务通用漫游与验收(2026-10-31)¶
分支:web。本轮使用当前 Mac 的同一个 OneTHU dev 与共享账号后台,验收浏览器为用户的普通 Chrome。没有新开 OneTHU、清除账号、输入密码或二次验证码,没有提交选课、预约、邮件、文件修改等业务操作。
根因与通用修正¶
Info 的框架页和业务接口是两层请求。恢复后的 XSRF-TOKEN 仍有值,但 WebVPN 的 Cookie body 不带 HttpOnly 属性,旧投影策略把浏览器的公开防伪值清掉,导致应用列表、待办、日历长期转圈。现在仅投影 Info 专用名称和 UUID 形式的公开防伪值,显式 HttpOnly 仍拒绝投影,认证 Cookie 留在权威运行时。
学校点击应用时先发送同步 POST onlineAppRedirect?yyfwid=…&machine=p,再打开返回的漫游地址。旧策略把这个应用查询和凭据兑票一起拒绝。新的查询入口与 GET roamingToApp 共用一套代理:浏览器只给应用 ID,后台向固定的官方 Info 接口获取真实目标,不接收浏览器提供的 target、callback 或 ticket。
云盘的官方入口使用 /thu-oauth/inforoam。原有 OAuth 路径枚举遗漏了这一协议入口。现在按官方 SSO 协议族识别,统一复用共享 Cookie、安装指纹和已有设备信任,再把学校返回的业务回跳交给目标原站。确认页仅提交已有指纹;流程不自动提交密码、发送验证码或登记新信任设备。另修复同一账号、同一设备交接时空字段覆盖已有信任凭据的问题。
邮箱等旧站可能把 HTTPS 回跳转换成 WebVPN 内部的 HTTP 服务。适配器根据已认证的同主机重定向学习真实上游协议,浏览器继续使用 HTTPS 地址。已实际工作的路线会持久保留,后续入口提供的默认路线不会覆盖它;正文中的 HTTP、HTTPS 和两种 WebVPN 包装地址统一还原到同一 HTTPS 站点。此逻辑覆盖同类协议转换,服务名称和服务 ID 不写入网关准入分支。
工作台和应用导航的两个无参数页面也加入了明确的只读落地入口,允许用户从外部链接或地址栏打开。例外仍要求用户激活、顶层文档、GET/HEAD、无请求正文、无 Origin 和精确 URL;带查询动作、表单、iframe 及子资源继续走原有来源校验。
路由、身份和生命周期¶
- 动态业务 origin 由官方入口与有界漫游结果登记,按账号 epoch 隔离。证书逐主机签发,CONNECT、证书缓存与内部请求共用实时登记状态。
- macOS 按原网络服务的代理规则分组监听。PAC 可覆盖校园 HTTPS;尚未登记的站点走透明 CONNECT,保留网站自己的 TLS 和原代理/绕过规则,不接收共享 Cookie。已有 SOCKS-only 配置暂时保留精确登记模式。
- 透明 CONNECT 的 10 秒预算只约束建连,成功后解除该计时,避免把它误当成长连接的空闲超时。
id、oauth、webvpn的普通浏览器页面保留原网络路径。经 Info 发起的业务 SSO 由后台完成,避免把业务半途交给另一套浏览器登录上下文。- 标准 Authorization 仅在本账号上游成功 JSON 中见证后使用,按 origin 和 epoch 保存哈希。体育等原站的自定义业务头维持透明转发,由目标应用校验;此前把所有名为 token 的业务头强制按同一策略拒绝,已造成真实 401,现已撤销该误判。代理不把这些未定义业务头视为所有业务账号一致性的证明。令牌原文不进入新的代理缓存。
- 服务路由和未过期的令牌哈希保存在现有私有、原子写入的会话存储,绑定账号摘要与 epoch。保存时剔除 callback URL、query、ticket 和未知字段;账号切换及退出会撤销登记。后台重启可恢复路由,避免再退回浏览器独立认证链。
- 动态直连 HTTPS 使用逐连接 DNS 结果固定和原主机 TLS 验证,拒绝 loopback、link-local、私网地址。保留 TUN 常用的 198.18/15 fake-IP 路由;不关闭 TLS 验证。来自 WebVPN 的路线继续使用固定网关出口。
- 内部 SSO 最多 8 跳、30 秒、128 KiB 页面。每个异步边界检查账号;遇到实际二次验证页面会停止并分类报错,不循环重试。
当前 Mac 实际结果¶
| 项目 | 证据与边界 |
|---|---|
| Info 我的工作台 | 普通 Chrome 重新加载后应用目录、74 条网络学堂待办入口、学期周次与活动日历恢复。相同后台的只读数据接口返回 200 / success。 |
| 云盘 | 从 Info「清华云盘」进入 cloud.tsinghua.edu.cn/,我的资料库列表正常显示,全程没有重新输入密码或验证码。未下载、上传、删除文件。 |
| 培养方案及计划 | 原站显示个人培养方案表格,包括本人所在院系和主修方案,不再显示“此功能不对您开放”。未编辑教学计划。 |
| ITS | 从官方应用目录完成回跳,进入“清华大学信息化用户服务平台”首页,栏目正常显示。没有创建报修或咨询记录。 |
| 体育 | 官方入口落新体育系统,显示当前登录姓名,已展开羽毛球分类并读取气膜馆、综体、西体前后馆名称。修复过度令牌检查后,后台重启再刷新仍可读取。没有预约或退订。 |
| MadModel | 官方入口落“清华大学 Deepseek 服务”界面,模型选择与提问框正常显示。未发送模型请求,未验证吞吐与模型服务端限流。 |
| 邮箱 | WebVPN 的同主机协议转换形成浏览器自重定向。现在仅对 GET/HEAD 在后台有界解析;重复路线允许一次固定 IP、验证原主机证书的直连,复用了同一 jar。实际已进入电子邮件系统并显示收件箱入口,后台重启后直接刷新仍恢复,没有阅读邮件正文。 |
| Learn 日历 | 已修复成功响应的词法改写,并接纳实际观察到的 PROPFIND / REPORT 只读 XML。原课程页刷新后未再出现“日历服务漫游失败”。尚未验证全部 CalDAV 查询及写操作。 |
重启与自动检查¶
真实重启验收中,六个动态服务登记已保存在现有私有会话文件,缓存不含 callback ticket。停止并启动同一个后台后,账号仍为 ready,系统代理重新接入且无待恢复项,原 OneTHU dev 进程保留。直接刷新云盘、体育和邮箱,无需从 Info 重新发起 SSO。邮箱另做了连续刷新、第二次官方入口漫游和后台重启后的刷新检查,均出现收件箱入口;只检查加载状态,没有读取邮件正文。
最终本地后台构建 ID:43a0fa8346561d866144f3445a000f73d40758e8fa8d2fdc91e45ddee5939481。最终回到本次截图的 Info 工作台地址后,应用服务与网络学堂入口可见,“正在加载中”计数归零。当前系统代理保持启用,使用原账号;未发布安装包。
发现过一次多标签连接突发下的 macOS 同 UID 检查超时;保留精确连接与 UID 校验,将包含排队时间的默认有界预算从 2 秒调至 8 秒,仍受网关连接与队列上限约束。
自动检查与后续验收边界¶
当前完整 SDK 检查 280 项、gateway 检查 134 项通过,SDK TypeScript 检查通过。测试覆盖新增未知服务、官方 OAuth inforoam、同步 POST 查询、二次验证停止、跨目标回跳拒绝、源令牌见证、账号切换、后台重建缓存、私有存储字段清理、同主机协议转换和原代理透明转发。
测试数对应本轮最后一次完整运行。真实账号结果只以上表和后续实测记录为准。Windows、Android、其他浏览器尚未完成本轮实机验收;无法由 Mac Chrome 的结果推出全部设备和学校所有业务均已可用。首次直接访问尚未由官方入口发现的陌生站点,目前保持原站会话和原代理,不自动借用共享身份;发现入口仍以官方 Info 为准。
日历只开放已观察到的 PROPFIND /calendars/<id>/ 和 REPORT /principals/<id>,请求最多 16 KiB,拒绝 DTD、实体、外部 href、未知查询和写入动作。207 状态与字节流保留。它不代表完整 CalDAV 支持。
关键实现:core/src/info/campusPortal.ts、sdk/src/node/campusProxy.ts、campusServiceTokens.ts、campusCalendar.ts、campusDirect.ts,以及 gateway 的 policy.mjs、certificates.mjs、manager.mjs、pac.mjs、passthrough.mjs。早期平台接入与恢复记录见 系统浏览器验收。