Files
realizemultiagent/shared/reports/user-auth-test-plan.md
2026-04-02 00:59:42 +08:00

143 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 用户注册登录模块 — 测试计划
## 1. 文档变更记录
| 日期 | 版本 | 变更说明 | 作者 |
|------|------|----------|------|
| 2026-03-28 | v0.1 | 初始版本,接口 review + 测试用例设计 | QA |
---
## 2. 接口设计 Review
### 2.1 发现的问题
| # | 问题 | 严重程度 | 说明 |
|---|------|----------|------|
| P1 | `POST /api/auth/send-code` 未限制发送频率 | 高 | 攻击者可无限发送短信验证码,造成资源浪费与安全隐患 |
| P2 | `POST /api/auth/register` 入参未校验 `code` 格式 | 中 | 未明确是 4 位还是 6 位数字,可能产生边界问题 |
| P3 | `POST /api/auth/login` 无登录失败次数限制 | 中 | 暴力破解风险,建议增加锁定机制 |
| P4 | `POST /api/auth/change-password` 无**旧密码**校验 | 高 | 只需手机号+验证码即可修改密码,账号被盗后攻击面大 |
| P5 | `DELETE /api/auth/devices/:id` 无被踢设备需**确认**机制 | 低 | 多设备并发操作可能导致误踢,建议增加二次确认字段 |
| P6 | Token 无刷新机制 | 中 | access token 过期后需重新登录,用户体验差 |
| P7 | `GET /api/auth/devices` 未返回 `lastActiveAt` 字段 | 低 | 前端无法判断设备活跃状态,用户体验受影响 |
### 2.2 待确认项(已记录,需与 BE 确认)
1. 验证码长度:是 4 位还是 6 位数字?
2. 同一手机号重复注册时,错误码和错误信息是什么?
3. Token 有效期是多久?(用于 V4 测试)
4. 图形验证码有效期是多久?
5. 多设备数量上限 3 个,是否包括当前登录设备本身?
---
## 3. 测试用例
### F1 用户注册
| ID | 场景 | 操作步骤 | 预期结果 | 优先级 | 对应验收标准 |
|----|------|----------|----------|--------|-------------|
| TC-F1-01 | 正常注册流程 | 1. 获取图形验证码 2. 发送短信验证码 3. 填写手机号+验证码+6位密码提交 | 注册成功,返回 token 和 user 信息 | P0 | — |
| TC-F1-02 | 同一手机号重复注册V1 | 使用已注册手机号重新走注册流程 | 返回错误码,提示手机号已注册 | P0 | V1 |
| TC-F1-03 | 图形验证码错误 | 发送短信时填入错误的图形验证码 | 返回错误,图形验证码校验失败 | P0 | — |
| TC-F1-04 | 短信验证码错误 | 注册时填入错误验证码 | 返回错误,验证码错误 | P0 | — |
| TC-F1-05 | 短信验证码过期V2 | 1. 发送验证码 2. 等待6分钟 3. 用过期验证码注册 | 返回错误,验证码已过期 | P0 | V2 |
| TC-F1-06 | 密码长度不足V3 | 注册时填写5位密码 | 返回错误密码长度不符合要求≥6位 | P0 | V3 |
| TC-F1-07 | 密码长度边界6位 | 注册时填写6位密码 | 注册成功 | P1 | V3 |
| TC-F1-08 | 手机号格式错误 | 填入非手机号格式 | 返回错误,手机号格式不正确 | P1 | — |
| TC-F1-09 | 密码为空 | 注册时不填密码 | 返回错误,密码不能为空 | P1 | — |
### F2 用户登录
| ID | 场景 | 操作步骤 | 预期结果 | 优先级 | 对应验收标准 |
|----|------|----------|----------|--------|-------------|
| TC-F2-01 | 正常登录 | 手机号+正确密码登录 | 登录成功,返回 token 和 user 信息 | P0 | — |
| TC-F2-02 | 密码错误 | 输入错误密码登录 | 返回错误,密码错误(不暴露手机号是否存在) | P0 | — |
| TC-F2-03 | 未注册手机号登录 | 使用未注册手机号登录 | 返回错误,手机号未注册 | P0 | — |
| TC-F2-04 | 空密码登录 | 不填密码直接登录 | 返回错误,密码不能为空 | P1 | — |
| TC-F2-05 | Token 正常有效性 | 登录后访问 `GET /api/auth/devices` | 返回设备列表 | P0 | — |
### F3 修改密码
| ID | 场景 | 操作步骤 | 预期结果 | 优先级 | 对应验收标准 |
|----|------|----------|----------|--------|-------------|
| TC-F3-01 | 正常修改密码 | 手机号+验证码+新密码6位以上提交 | 修改成功,返回成功信息 | P0 | — |
| TC-F3-02 | 新密码长度不足 | 修改密码时填写5位新密码 | 返回错误,密码长度不符合要求 | P0 | V3 |
| TC-F3-03 | 修改密码后原Token有效性 | 修改密码后用原 token 访问受保护接口 | 需确认Token 是否仍然有效 | P1 | — |
| TC-F3-04 | 修改密码后其他设备状态 | 一台设备修改密码后,检查其他设备 Token | 建议:其他设备 Token 应失效(安全考虑) | P1 | — |
### F4 多设备管理
| ID | 场景 | 操作步骤 | 预期结果 | 优先级 | 对应验收标准 |
|----|------|----------|----------|--------|-------------|
| TC-F4-01 | 查看设备列表 | 登录后访问 `GET /api/auth/devices` | 返回当前账号的登录设备列表 | P0 | — |
| TC-F4-02 | 强制下线指定设备 | 调用 `DELETE /api/auth/devices/:id` 下线非当前设备 | 指定设备被下线,返回成功 | P0 | — |
| TC-F4-03 | 强制下线当前设备 | 尝试下线自己 | 应允许,提示当前设备已下线 | P1 | — |
| TC-F4-04 | 下线不存在设备 | 用无效 deviceId 调用下线接口 | 返回错误,设备不存在 | P1 | — |
| TC-F4-05 | 第4设备踢出第1设备V5 | 1. 登录设备AB、C、D 2. 登录第4个设备D 3. 检查设备A的Token状态 | 设备A被踢出Token失效再次访问接口返回401 | P0 | V5 |
| TC-F4-06 | 第4设备登录后立即访问 | 登录第4个设备后立刻用第1个设备发起请求 | 第1设备请求应被拒绝401 | P0 | V5 |
### F5 Token 安全V4
| ID | 场景 | 操作步骤 | 预期结果 | 优先级 | 对应验收标准 |
|----|------|----------|----------|--------|-------------|
| TC-F5-01 | Token 过期拒绝访问 | 1. 获取 Token 2. 等待 Token 过期(或手动篡改) 3. 用过期 Token 访问 `GET /api/auth/devices` | 返回 401 UnauthorizedToken 已过期 | P0 | V4 |
| TC-F5-02 | 伪造 Token 访问 | 使用伪造的 JWT Token 访问受保护接口 | 返回 401 Unauthorized | P0 | V4 |
| TC-F5-03 | 无 Token 访问受保护接口 | 直接访问 `GET /api/auth/devices` 不带 Authorization | 返回 401 Unauthorized | P0 | V4 |
| TC-F5-04 | 畸形 Token 格式 | 发送格式错误的 Authorization header | 返回 401 Unauthorized | P1 | V4 |
---
## 4. 测试数据要求
| 数据项 | 要求 |
|--------|------|
| 手机号 | 至少准备 3 个有效手机号(用于多设备测试) |
| 密码 | 准备 5 位无效、6位边界有效、8位正常有效各一个 |
| 短信验证码 | 由后端提供测试专用通道或 mock |
| 图形验证码 | 由后端提供测试专用 key/code |
| 设备名称 | 模拟 4 种不同设备名iPhone 14, Xiaomi 13, iPad Pro, Web Browser |
---
## 5. 测试环境要求
1. **数据库**:测试环境独立数据库,支持数据清理
2. **短信网关**:测试环境使用日志打印或内存 mock不真实发送短信
3. **JWT Secret**:测试环境使用固定密钥,支持手动构造过期 Token
4. **多设备模拟**:支持在 4 个不同"设备"上同时登录HTTP Header 或 Cookie 区隔)
---
## 6. 阻塞项(等待 BE/FE 完成后才能执行)
- [ ] BE短信验证码发送与验证逻辑实现
- [ ] BEJWT Token 生成与验证逻辑实现
- [ ] BE多设备登录数量限制3个及踢出逻辑实现
- [ ] BE密码加密存储及修改逻辑实现
- [ ] FE注册/登录页面 UI 实现
- [ ] FE多设备管理页面实现
---
## 7. 测试进度
| 模块 | 状态 | 开始时间 | 完成时间 | 备注 |
|------|------|----------|----------|------|
| 接口 Review | ✅ 完成 | 2026-03-28 | 2026-03-28 | — |
| 测试用例设计 | ✅ 完成 | 2026-03-28 | 2026-03-28 | — |
| 测试环境准备 | ⏳ 待开始 | — | — | 等待 BE |
| 功能测试执行 | ⏳ 待开始 | — | — | 等待 BE/FE |
| 测试报告 | ⏳ 待开始 | — | — | — |
---
## 8. 风险项
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| 短信验证码 mock 依赖 BE 配合 | 测试进度可能受阻 | 提前约定 mock 接口格式 |
| 多设备并发测试难以在纯 HTTP 模拟 | 需明确设备唯一标识策略 | 与 BE 确认 Device Token 隔离机制 |
| Token 过期等待时间较长V2 需等5分钟V4 需等 Token 过期) | 延长测试周期 | BE 提供 Token 过期时间配置,支持快速触发过期 |