跳转至

2026-10-23 登录恢复、设备身份与登录页更新审查

问题与证据

0.11.2 用户在同一时段报告 AUTH-FAIL reason=unexpected-page stage=credential-entry,学习诊断为 webvpn-guide len=2760。随后用户反馈能够再次登录。学习页诊断与认证入口诊断属于两个响应,现有报告不足以证明它们是同一份 HTML。

本次使用全新 CookieJar、应用既有 User-Agent,对公开 OAuth 入口进行单次匿名 GET。当前路径经过 WebVPN、OAuth 后返回正常统一认证登录表单,HTTP 200,正文 17,524 字符,含公钥字段。此检查未提交账号或密码,只说明检查时该路径正常。失败时的原始响应尚未取得,因此学校服务短时异常属于与现象一致的推断。

已定位的客户端问题

会话探测与密码登录混用

旧启动流程把学习服务异常统一转换为 false,10 秒看门狗也返回 false,随后尝试已保存密码。这会将网关故障、限流和网络问题升级为额外认证请求。新的结果模型区分已验证、明确失登与服务不可用;超时释放启动界面,同时继续观察原请求。

有已验证归属的本地快照时,服务不可用允许显示该账号的本地视图;底层会话不会因此被标为已验证。没有可靠归属时留在登录页。手动登录、返回登录与退出操作拥有更高优先级,旧探测结果不能覆盖它们。

设备指纹旧实现依赖先读后写,首次并发与存储失效可能生成多个身份。新实现共享一次生成和读取结果,通过本地记录与原生镜像恢复同一安装的身份。

认证入口过去每次清理 ID/OAuth Cookie。现在已知同账号可复用;切换账号、未知归属和退出时清理隔离。恢复会话先核对两份持久化快照,再水合 Cookie 和访问学校。写入中断造成归属冲突时回到登录,并给出“本机登录记录不一致”提示。记住的凭据只有与快照同账号时才注入。

原生请求和云盘窗口的晚返回

原生 Cookie 仓增加账号代次。reqwest 的 Cookie provider 在读取与写入时持锁检查请求所属代次,完整清仓推进代次并立即保存空仓;旧响应在自动写 Cookie 前即被拒绝。返回前端的正文读取、克隆响应与显式种票继续检查同一代次。云盘登录窗口、移动系统 WebView 与静默 profile 读取也使用此约束。GitLab 种子文件写入与清理按顺序完成,避免退出后旧写入重新落盘。

学校的统一登录与信任选项

实际表单中的 singleLogin 文案为“本次登录使用信任浏览器访问校内其他系统时不必再输入账号密码(统一登录)”,默认未勾选。公开表单没有说明它每次是否创建持久信任因子,服务端去重行为也未以真实账号验证。

本次去掉主认证、直接 CAS 和选课恢复三条路径的自动勾选,同时清除可能由隐藏字段回带的 singleLogin/deviceName。既有指纹、信任令牌、CSRF 和正常二次验证保留。用户在验证码阶段明确选择保存信任设备的路径仍然存在。现有学校信任记录由学校账户管理页面维护。

登录页更新

唯一的更新提醒宿主从已登录布局提升到应用路由层。登录失效后仍能检查公开更新清单、展示公告和打开独立下载界面。登录和二次验证页都有手动入口。后台自动提醒在登录请求、验证码输入、已有对话框和导览期间等待,主动查看更新会保留已有输入。

下载复用现有双源、SHA-256 校验和安装器确认流程。公告按文本显示并独立滚动。延后提醒按版本保存,可选择 1 小时、1 天和 7 天。三种体验模式及中英文共用相同策略。

验证范围

  • 认证表单真实函数回归覆盖一次提交、错误页面、网关、限流、已有信任、2FA 和恢复互斥。
  • CAS 补充回归检查隐藏字段回带、加密请求体和 2FA 分支。
  • 登录界面 Chromium 模拟手机与桌面:137 项检查通过;所有学校请求均为隔离夹具。
  • 登录更新界面 69 项检查通过:学校接口全部返回 503 时,仍能检查更新、滚动公告并走下载与安装确认;包含中英文、三模式、验证码保留,以及关闭退场、主动取消和监听注册期间取消的晚返回情况。
  • 已登录更新界面 133 项检查通过:中英文、三模式、手机/桌面、窄屏、延后持久化、返回键、导览遮挡和源故障恢复。
  • 认证主链 35 项、补充 CAS 7 项、账号恢复 67 项、Cookie 边界 15 项、会话守卫 4 组、原生桥代次 8 项、云盘账户生命周期 25 项通过。
  • Rust 库测试 79 项通过、12 项按既有配置忽略;其中安全测试 14 项通过。Android 系统桥 Kotlin 编译通过。
  • 核心库、认证库、桌面 TypeScript 检查通过;中英文各 7,591 个键完整,Android 62 个回退模板一致。

这些检查不等同于真实 Windows 或 Android 设备上的学校账号联调。公开学校接口的单次只读探测也不能还原此前故障。0.11.3 的最终构建来源、安装包验证和渠道状态在发布审查记录中补充。