Skip to content

2026-08-23 迭代 — 验收用例(TC) ​

依据 PRD 原文 与 技术方案。术语见技术方案第 13 章。 本文档与 PRD、技术方案一同评审,评审通过后方可作为验收依据。

怎么用 ​

  • 会上逐条执行,当场记「通过 / 不通过」,不通过需写明实际现象
  • 离线项由研发在 08-22 前跑完并附证据(截图 / 日志 / 录屏),会上只过结论
  • 判定以「判定阈值」为准。阈值未达成即不通过,不接受"基本可以"
  • 验收窗口 45 分钟,会上用例 10 条,其余走离线

环境前置(会前完成) ​

  • 认证中心、IM 服务端均已部署到验收环境,域名与证书可用,反代已按部署文档配置
  • 两台设备:设备甲(macOS)、设备乙(Windows),均可访问验收环境
  • 两个测试账号 A、B;两个平台的桌面包均已构建并可下载安装
  • 准备一个抓包/改包工具(构造异常参数与越权请求用)

用例全景 ​

按被验对象分七组。每组下再按 正确路径 / 失败路径 / 异常参数 / 越权 展开。


A 登录与 SSO ​

正确路径 ​

编号用例步骤要点判定阈值类型
A1独立访问子应用触发登录清空站点数据 → 直接打开 IM 地址 → 用 A 登录登录环节地址栏落在认证中心域名;回跳后可见会话列表;IM 前端不出现自带登录表单;全程零手动复制凭证会上
A2SSO 免登接 A1,同浏览器新标签打开壳从打开壳到进入工作台,用户零次密码输入会上
A3壳内子应用由壳注入登录态壳内打开 IM → 开发者工具观察 iframe 导航iframe 内无任何指向认证中心的导航记录,且能正常拉取会话数据会上
A4桌面包安装并回环登录甲乙两台各跑一遍(两人同时操作,不串行)两个平台都通过才算通过;密码输入发生在系统浏览器;回跳自动完成。Windows 的 SmartScreen 警告属预期(本期不做代码签名),点「仍要运行」能装即通过会上

失败路径与异常参数 ​

编号用例构造的输入判定阈值类型
A5授权码一次性同一个 code 兑换两次第二次被拒绝且不签发任何令牌;该设备会话被吸销离线
A6PKCE 校验用错误的 code_verifier 兑换拒绝签发;错误响应中不含 code_challenge 等内部值离线
A7非法回调地址①完全不在白名单的地址 ②与白名单仅路径不同的地址两者均被拒绝且不签发授权码——回调地址必须精确匹配,仅前缀相同也须拒绝离线
A8错误密码与不存在的账号错误密码;不存在的用户名均给出明确失败提示,且两种情况的响应不可区分(不泄露账号是否存在)离线

B 会话与设备 ​

编号用例步骤要点判定阈值类型
B1登录设备列表A 在甲乙两台登录后,查看「登录设备」恰好 2 条记录(同机的壳与子应用不得产生两条);含名称/类型、登录时间、最近活跃时间;当前设备标注「本机」会上
B4越权踢他人设备用 A 的令牌,构造 DELETE /devices/{B 的设备 id}拒绝,且 B 的设备不受任何影响(列表与在线状态均无变化)离线

B2 强制下线:正常链路 ≤5 秒 ​

  • 前置:接 B1,甲乙均在线且 IM 长连接已建立
  • 步骤:甲上对乙执行「退出登录」并同时开始计时 → 观察乙 → 在乙上尝试发消息 → 观察甲
  • 预期:乙回到登录页并提示「你的账号已在其他设备上退出登录」;乙的发消息请求被拒绝;甲不受影响
  • 判定阈值:从点击到乙回到登录页 ≤ 5 秒;被下线后乙的接口调用返回鉴权失败而非成功;甲的长连接不中断
  • 类型:会上

B3 降级链路:webhook 不可达时 ≤60 秒 ​

  • 为什么单独验:5 秒是 webhook 正常时的承诺。webhook 全部失败、只剩轮询兜底时指标退化到 60 秒——这条不验,故障时就没人知道真实表现
  • 步骤:人为阻断认证中心到 IM 的 webhook(防火墙或改配置)→ 执行一次强制下线 → 计时
  • 判定阈值:≤ 60 秒内被踢端回到登录页;恢复 webhook 后无重复吊销、无异常
  • 类型:离线

C 令牌与凭证安全 ​

编号用例步骤要点判定阈值类型
C1访问令牌静默续期页面保持打开,跨过至少一个访问令牌有效期,期间正常收发全程无感知:不掉线、不弹登录页;网络面板可见续期请求会上
C5登录持久化刷新页面;完全关闭浏览器后重开;桌面端重启应用三种情况均仍处登录态,无需重输密码会上
C2刷新令牌轮换连续触发两次续期,记录每次返回的刷新令牌每次返回的刷新令牌均不相同(确实在轮换,而非返回同一枚)离线
C3旧刷新令牌重放保留轮换前的旧令牌,正常续期一次后再用旧令牌续期旧令牌被拒绝,且该设备整条会话被吸销——重放后该设备被迫重登,「登录设备」中该条消失离线
C4凭证与密码不落地检索两个后端日志;检查桌面端凭证存储;检查 IM 数据库;检索浏览器各类本地存储日志中无明文密码与完整令牌;桌面端刷新令牌在系统凭证库而非明文文件;nexo-im-api 库中已无 users / devices 认证数据;本地存储中检索不到访问令牌离线

D 接口鉴权与越权 ​

对 IM 与认证中心的每个受保护接口,统一验四种输入。

编号用例构造的输入判定阈值类型
D1未带令牌去掉 Authorization 调 /devices、IM 会话与消息接口全部拒绝;响应体不含任何业务数据离线
D2过期令牌用已过期的访问令牌调同一批接口全部拒绝离线
D3已吊销设备的令牌踢掉某设备后,立刻用它那枚尚未过期的访问令牌调 IM 接口拒绝。验签虽通过,但吊销集合必须拦下——这条是"本地验签"方案最容易漏的地方离线
D4越权读他人会话用 A 的令牌请求 B 与 C 之间会话的消息拒绝,且响应中不含任何消息内容(不能只在前端隐藏)离线

E 服务间接口 ​

编号用例步骤要点判定阈值类型
E1/internal/* 公网不可达从公网直接请求 /internal/revocations 与 /internal/users返回 404/403,不是 200。反代必须显式拒绝 /internal/ 前缀——配错了平时毫无征兆,只能靠这条查出来会上
E2无签名或错签名被拒不带 HMAC 签名、以及带错误签名各调一次均拒绝离线
E3重放被拒①原样重放一个合法请求 ②用超出 ±60 秒窗口的时间戳均拒绝(nonce 重复、时间戳越界)离线

F IM 回归 ​

编号用例步骤要点判定阈值类型
F1认证改造后收发不回归A 发消息给 B,B 查看并回复;A 切换会话再切回单向端到端延迟 ≤ 1s;切换会话后消息归属正确、上下文不串扰会上
F2重启后吊销状态不复活踢掉某设备 → 重启 nexo-im-api → 用该设备原令牌调接口仍被拒绝。若重启后放行,说明启动时的吊销集合全量拉取没做——已吊销设备会一直可用到令牌自然过期离线

G 工程交付 ​

编号用例步骤要点判定阈值类型
G1关键事件日志完整依次触发登录成功、登录失败、授权码签发与兑换、令牌续期、设备吊销、webhook 投递、WS 建连与断开上述事件逐一有据可查,缺任一即不通过;能从日志还原「哪个用户的哪台设备」;两个后端日志格式一致(同一套 logger,非各自初始化)离线
G2部署与分发文档可用由未参与本期开发的人照文档:在干净环境起 nexo-auth → 部署壳 → 两个平台各装一次桌面包执行者中途提问次数为 0;提问即说明文档有缺口,补完再验离线

记录表 ​

编号用例类型结果备注
A1独立访问触发登录会上
A2SSO 免登会上
A3壳内注入登录态会上
A4桌面包安装与回环登录(双平台)会上
B1登录设备列表会上
B2强制下线 ≤5 秒会上
C1访问令牌静默续期会上
C5登录持久化会上
E1/internal/* 公网不可达会上
F1IM 收发不回归会上
A5授权码一次性离线
A6PKCE 校验离线
A7非法回调地址离线
A8错误密码与不存在账号离线
B3降级链路 ≤60 秒离线
B4越权踢他人设备离线
C2刷新令牌轮换离线
C3旧刷新令牌重放离线
C4凭证与密码不落地离线
D1未带令牌离线
D2过期令牌离线
D3已吊销设备的令牌离线
D4越权读他人会话离线
E2无签名或错签名被拒离线
E3重放被拒离线
F2重启后吊销不复活离线
G1关键事件日志完整离线
G2部署与分发文档可用离线