HaniBlindBox/.kiro/specs/refresh-token/requirements.md
2026-01-25 19:10:31 +08:00

86 lines
4.9 KiB
Markdown
Raw 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.

# Requirements Document
## Introduction
为 HoneyBox 前端 API 实现双 Token 认证机制Access Token + Refresh Token解决 Token 过期后用户需要重新登录的问题,提升用户体验。当 Access Token 过期时,前端可以使用 Refresh Token 自动获取新的 Token实现无感刷新。
## Glossary
- **Access_Token**: 短期有效的 JWT 令牌,用于 API 请求认证,有效期 30 分钟
- **Refresh_Token**: 长期有效的刷新令牌,用于获取新的 Access Token有效期 7 天
- **Token_Rotation**: Token 轮换机制,每次刷新时生成新的 Refresh Token 并废弃旧的
- **Auth_Service**: 认证服务处理登录、Token 生成和刷新逻辑
- **Request_Manager**: 前端网络请求管理器,封装统一的请求方法
- **User_Refresh_Token**: 用户刷新令牌数据库实体,存储 Refresh Token 信息
## Requirements
### Requirement 1: 登录接口返回双 Token
**User Story:** As a 用户, I want 登录成功后获取 Access Token 和 Refresh Token, so that 我可以在 Access Token 过期后使用 Refresh Token 刷新而无需重新登录。
#### Acceptance Criteria
1. WHEN 用户通过微信小程序登录成功, THE Auth_Service SHALL 返回包含 accessToken、refreshToken 和 expiresIn 的响应对象
2. WHEN 用户通过手机号验证码登录成功, THE Auth_Service SHALL 返回包含 accessToken、refreshToken 和 expiresIn 的响应对象
3. THE Auth_Service SHALL 生成有效期为 30 分钟的 Access_Token
4. THE Auth_Service SHALL 生成有效期为 7 天的 Refresh_Token
5. THE Auth_Service SHALL 将 Refresh_Token 的哈希值存储到 User_Refresh_Token 表中
### Requirement 2: Token 刷新接口
**User Story:** As a 用户, I want 使用 Refresh Token 获取新的 Access Token, so that 我可以在 Access Token 过期后继续使用应用而无需重新登录。
#### Acceptance Criteria
1. WHEN 用户携带有效的 Refresh_Token 请求刷新接口, THE Auth_Service SHALL 返回新的 accessToken、refreshToken 和 expiresIn
2. WHEN 用户携带已过期的 Refresh_Token 请求刷新接口, THE Auth_Service SHALL 返回错误信息 "刷新令牌已过期"
3. WHEN 用户携带已撤销的 Refresh_Token 请求刷新接口, THE Auth_Service SHALL 返回错误信息 "刷新令牌已失效"
4. WHEN 用户携带无效的 Refresh_Token 请求刷新接口, THE Auth_Service SHALL 返回错误信息 "无效的刷新令牌"
5. WHEN Token 刷新成功, THE Auth_Service SHALL 撤销旧的 Refresh_Token 并生成新的 Refresh_TokenToken 轮换)
6. THE Auth_Service SHALL 记录 Token 轮换的关联关系用于安全审计
### Requirement 3: 前端自动刷新机制
**User Story:** As a 用户, I want 前端在 Access Token 过期时自动刷新, so that 我可以无感知地继续使用应用。
#### Acceptance Criteria
1. WHEN 前端收到 HTTP 401 响应, THE Request_Manager SHALL 自动使用 Refresh_Token 调用刷新接口
2. WHEN Token 刷新成功, THE Request_Manager SHALL 更新本地存储的 accessToken 和 refreshToken
3. WHEN Token 刷新成功, THE Request_Manager SHALL 使用新的 Access_Token 重试原始请求
4. WHEN Token 刷新失败Refresh_Token 也过期), THE Request_Manager SHALL 清除本地存储并跳转到登录页
5. WHILE 正在刷新 Token, THE Request_Manager SHALL 将其他请求加入队列等待刷新完成
6. WHEN Token 刷新完成, THE Request_Manager SHALL 使用新 Token 依次执行队列中的请求
### Requirement 4: Token 存储安全
**User Story:** As a 系统管理员, I want Token 安全存储, so that 用户的认证信息不会被泄露。
#### Acceptance Criteria
1. THE Auth_Service SHALL 使用 SHA256 哈希存储 Refresh_Token不存储明文
2. THE Request_Manager SHALL 将 accessToken 和 refreshToken 存储在 uni.storage 中
3. WHEN 用户退出登录, THE Request_Manager SHALL 清除本地存储的所有 Token
4. WHEN 用户退出登录, THE Auth_Service SHALL 撤销该用户的 Refresh_Token
### Requirement 5: 数据库支持
**User Story:** As a 开发者, I want 数据库支持 Refresh Token 存储, so that 系统可以管理和验证 Refresh Token。
#### Acceptance Criteria
1. THE User_Refresh_Token 表 SHALL 包含字段Id、UserId、TokenHash、ExpiresAt、CreatedAt、CreatedByIp、RevokedAt、RevokedByIp、ReplacedByToken
2. THE User_Refresh_Token 表 SHALL 与 User 表建立外键关联
3. WHEN 查询 Refresh_Token 时, THE Auth_Service SHALL 同时检查是否过期和是否已撤销
### Requirement 6: 向后兼容
**User Story:** As a 开发者, I want 新的认证机制向后兼容, so that 现有的前端代码可以平滑迁移。
#### Acceptance Criteria
1. THE Auth_Service SHALL 继续支持旧的登录响应格式(仅返回 token 字符串)直到前端完全迁移
2. WHEN 前端未传递 refreshToken, THE Auth_Service SHALL 按照旧逻辑处理 401 错误
3. THE Auth_Service SHALL 继续维护 UserAccount 表中的 account_token 用于兼容旧系统