HaniBlindBox/.kiro/specs/admin-system/tasks.md
2026-01-05 23:22:20 +08:00

166 lines
6.0 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.

# Implementation Plan: Token 刷新机制 & 图形验证码
## Overview
本任务清单实现两个安全增强功能Token 刷新机制和图形验证码。采用增量开发方式,先完成后端 API再更新前端。
## Tasks
- [x] 1. 创建 RefreshToken 数据库实体和迁移
- [x] 1.1 创建 RefreshToken 实体类
-`Entities/` 目录创建 `RefreshToken.cs`
- 包含 Id, AdminUserId, TokenHash, ExpiresAt, CreatedAt, CreatedByIp, RevokedAt, RevokedByIp, ReplacedByToken 字段
- 添加 IsExpired, IsRevoked, IsActive 计算属性
- _Requirements: 13.2_
- [x] 1.2 更新 AdminDbContext 配置
- 添加 DbSet<RefreshToken>
- 配置实体映射和索引
- _Requirements: 13.2_
- [x] 1.3 创建数据库迁移脚本
- 创建 `Data/Migrations/add_refresh_tokens.sql`
- 包含表创建和索引
- _Requirements: 13.2_
- [x] 2. 实现验证码服务
- [x] 2.1 创建验证码服务接口和实现
- 创建 `Services/ICaptchaService.cs` 接口
- 创建 `Services/CaptchaService.cs` 实现
- 使用 SkiaSharp 或 System.Drawing 生成图片
- 生成 4-6 位字母数字验证码
- 添加干扰线和噪点
- _Requirements: 14.2, 14.3_
- [x] 2.2 创建验证码请求/响应模型
- 创建 `Models/Auth/CaptchaResponse.cs`
- 包含 CaptchaKey 和 CaptchaImage (base64)
- _Requirements: 14.8_
- [x] 2.3 实现验证码缓存存储
- 使用 IMemoryCache 存储验证码
- 设置 5 分钟过期时间
- 实现验证后立即删除
- _Requirements: 14.3, 14.6_
- [x] 2.4 编写验证码服务单元测试
- 测试验证码格式4-6位字母数字
- 测试验证码过期机制
- 测试单次使用约束
- **Property 10: Captcha code characteristics**
- **Validates: Requirements 14.2**
- [x] 3. 扩展认证服务支持 Token 刷新
- [x] 3.1 创建 Token 刷新相关模型
- 扩展 `LoginRequest` 添加 CaptchaKey, CaptchaCode
- 扩展 `LoginResponse` 改 Token 为 AccessToken添加 RefreshToken
- 创建 `RefreshTokenRequest.cs``RefreshTokenResponse.cs`
- _Requirements: 13.1_
- [x] 3.2 扩展 IAuthService 接口
- 添加 RefreshTokenAsync 方法
- 添加 RevokeTokenAsync 方法
- 添加 RevokeAllTokensAsync 方法
- _Requirements: 13.4, 13.6, 13.8_
- [x] 3.3 实现 RefreshToken 生成和存储
- 生成安全随机 Token
- 哈希后存储到数据库
- 设置 7 天过期时间
- _Requirements: 13.1, 13.2_
- [x] 3.4 实现 Token 刷新逻辑
- 验证 RefreshToken 有效性
- 生成新的 AccessToken
- 可选:轮换 RefreshToken
- _Requirements: 13.4, 13.5_
- [x] 3.5 实现 Token 撤销逻辑
- 单个 Token 撤销(登出)
- 用户所有 Token 撤销(强制下线)
- _Requirements: 13.6, 13.8_
- [x] 3.6 修改登录逻辑集成验证码
- 验证码校验优先于密码校验
- 验证码错误不增加登录失败次数
- 登录成功后生成双 Token
- _Requirements: 14.4, 14.5, 13.1_
- [x] 3.7 编写认证服务单元测试
- 测试验证码校验优先级
- 测试 Token 刷新逻辑
- 测试 Token 撤销逻辑
- **Property 12: Captcha validation before password check**
- **Validates: Requirements 14.4, 14.5**
- _Note: Tests written but xUnit discovery issue needs investigation_
- [x] 4. 更新 AuthController API
- [x] 4.1 添加验证码获取接口
- `POST /api/admin/auth/captcha`
- 返回 CaptchaKey 和 Base64 图片
- _Requirements: 14.8_
- [x] 4.2 添加 Token 刷新接口
- `POST /api/admin/auth/refresh`
- 接收 RefreshToken返回新 Token
- _Requirements: 13.4_
- [x] 4.3 修改登录接口
- 接收验证码参数
- 返回双 Token
- _Requirements: 13.1, 14.4_
- [x] 4.4 修改登出接口
- 撤销 RefreshToken
- _Requirements: 13.6_
- [x] 4.5 添加强制下线接口(可选)
- `POST /api/admin/auth/revoke-all`
- 撤销用户所有 Token
- _Requirements: 13.8_
- [x] 5. Checkpoint - 后端功能验证
- 确保所有后端 API 正常工作
- 使用 Postman/Swagger 测试接口
- 确保所有测试通过,如有问题请询问用户
- [x] 6. 更新前端 Token 管理
- [x] 6.1 扩展 auth.ts 工具函数
- 添加 AccessToken/RefreshToken 分离存储
- 添加 Token 过期时间存储
- 实现 isTokenExpiringSoon() 函数
- _Requirements: 13.3_
- [x] 6.2 扩展 auth API
- 添加 getCaptcha() 接口
- 添加 refreshToken() 接口
- 更新 login() 请求/响应类型
- _Requirements: 13.1, 14.8_
- [x] 6.3 增强请求拦截器
- 实现自动 Token 刷新
- 防止并发刷新Promise 锁)
- 401 错误时尝试刷新
- _Requirements: 13.3, 13.4_
- [x] 6.4 编写前端工具函数测试
- 测试 isTokenExpiringSoon() 边界条件
- **Property 3: Token expiration detection**
- **Validates: Requirements 13.3**
- [x] 7. 更新登录页面
- [x] 7.1 添加验证码组件
- 显示验证码图片
- 添加刷新按钮
- 绑定验证码输入框
- _Requirements: 14.1, 14.7_
- [x] 7.2 更新登录表单
- 添加验证码字段验证规则
- 登录前获取验证码
- 登录失败后刷新验证码
- _Requirements: 14.4, 14.5_
- [x] 7.3 更新 user store
- 存储双 Token
- 更新登出逻辑
- _Requirements: 13.1, 13.6_
- [x] 8. 实现账号禁用时撤销 Token
- [x] 8.1 修改 AdminUserService
- 禁用账号时调用 RevokeAllTokensAsync
- _Requirements: 13.7_
- [x] 9. Final Checkpoint - 完整功能验证
- 测试完整登录流程(验证码 → 登录 → 双Token
- 测试 Token 自动刷新
- 测试登出和强制下线
- 确保所有测试通过,如有问题请询问用户
## Notes
- 所有任务都是必须完成的,包括测试任务
- 每个任务都引用了具体的需求条款以便追溯
- Checkpoint 任务用于阶段性验证,确保增量开发的稳定性
- 验证码图片生成推荐使用 SkiaSharp跨平台或 System.Drawing.Common