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