外观
2026-08-23 迭代 — 验收用例(TC)
依据 PRD 原文 与 技术方案。术语见技术方案第 13 章。 本文档与 PRD、技术方案一同评审,评审通过后方可作为验收依据。
怎么用
- 会上逐条执行,当场记「通过 / 不通过」,不通过需写明实际现象
- 离线项由研发在 08-22 前跑完并附证据(截图 / 日志 / 录屏),会上只过结论
- 判定以「判定阈值」为准。阈值未达成即不通过,不接受"基本可以"
- 验收窗口 45 分钟,会上用例 10 条,其余走离线
环境前置(会前完成)
- 认证中心、IM 服务端均已部署到验收环境,域名与证书可用,反代已按部署文档配置
- 两台设备:设备甲(macOS)、设备乙(Windows),均可访问验收环境
- 两个测试账号 A、B;两个平台的桌面包均已构建并可下载安装
- 准备一个抓包/改包工具(构造异常参数与越权请求用)
用例全景
按被验对象分七组。每组下再按 正确路径 / 失败路径 / 异常参数 / 越权 展开。
A 登录与 SSO
正确路径
| 编号 | 用例 | 步骤要点 | 判定阈值 | 类型 |
|---|---|---|---|---|
| A1 | 独立访问子应用触发登录 | 清空站点数据 → 直接打开 IM 地址 → 用 A 登录 | 登录环节地址栏落在认证中心域名;回跳后可见会话列表;IM 前端不出现自带登录表单;全程零手动复制凭证 | 会上 |
| A2 | SSO 免登 | 接 A1,同浏览器新标签打开壳 | 从打开壳到进入工作台,用户零次密码输入 | 会上 |
| A3 | 壳内子应用由壳注入登录态 | 壳内打开 IM → 开发者工具观察 iframe 导航 | iframe 内无任何指向认证中心的导航记录,且能正常拉取会话数据 | 会上 |
| A4 | 桌面包安装并回环登录 | 甲乙两台各跑一遍(两人同时操作,不串行) | 两个平台都通过才算通过;密码输入发生在系统浏览器;回跳自动完成。Windows 的 SmartScreen 警告属预期(本期不做代码签名),点「仍要运行」能装即通过 | 会上 |
失败路径与异常参数
| 编号 | 用例 | 构造的输入 | 判定阈值 | 类型 |
|---|---|---|---|---|
| A5 | 授权码一次性 | 同一个 code 兑换两次 | 第二次被拒绝且不签发任何令牌;该设备会话被吸销 | 离线 |
| A6 | PKCE 校验 | 用错误的 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 | 独立访问触发登录 | 会上 | ||
| A2 | SSO 免登 | 会上 | ||
| A3 | 壳内注入登录态 | 会上 | ||
| A4 | 桌面包安装与回环登录(双平台) | 会上 | ||
| B1 | 登录设备列表 | 会上 | ||
| B2 | 强制下线 ≤5 秒 | 会上 | ||
| C1 | 访问令牌静默续期 | 会上 | ||
| C5 | 登录持久化 | 会上 | ||
| E1 | /internal/* 公网不可达 | 会上 | ||
| F1 | IM 收发不回归 | 会上 | ||
| A5 | 授权码一次性 | 离线 | ||
| A6 | PKCE 校验 | 离线 | ||
| A7 | 非法回调地址 | 离线 | ||
| A8 | 错误密码与不存在账号 | 离线 | ||
| B3 | 降级链路 ≤60 秒 | 离线 | ||
| B4 | 越权踢他人设备 | 离线 | ||
| C2 | 刷新令牌轮换 | 离线 | ||
| C3 | 旧刷新令牌重放 | 离线 | ||
| C4 | 凭证与密码不落地 | 离线 | ||
| D1 | 未带令牌 | 离线 | ||
| D2 | 过期令牌 | 离线 | ||
| D3 | 已吊销设备的令牌 | 离线 | ||
| D4 | 越权读他人会话 | 离线 | ||
| E2 | 无签名或错签名被拒 | 离线 | ||
| E3 | 重放被拒 | 离线 | ||
| F2 | 重启后吊销不复活 | 离线 | ||
| G1 | 关键事件日志完整 | 离线 | ||
| G2 | 部署与分发文档可用 | 离线 |