Skip to content

认证模块开发文档

迭代编号: sprint-1
模块: 认证模块
状态: ✅ 已完成


开发任务

  • [√] 登录页面开发
  • [√] 登录API开发
  • [√] Token刷新机制
  • [√] 登出功能开发

技术方案

架构设计

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   前端 (Vue3)   │────▶│   后端 (Nitro)  │────▶│   Redis缓存     │
│                 │◀────│                 │◀────│                 │
└─────────────────┘     └─────────────────┘     └─────────────────┘
        │                       │
        │                       ▼
        │               ┌─────────────────┐
        │               │   JWT Token     │
        │               │   签发/验证     │
        │               └─────────────────┘


┌─────────────────┐
│  LocalStorage   │
│  Token存储      │
└─────────────────┘

认证流程

  1. 用户登录

    • 前端提交用户名/密码
    • 后端验证用户身份
    • 签发Access Token(30分钟有效期)和Refresh Token(7天有效期)
    • Token存储到Redis,设置过期时间
  2. Token刷新

    • Access Token过期前自动刷新
    • 使用Refresh Token换取新的Access Token
    • 刷新时更新Redis中的Token记录
  3. 用户登出

    • 清除前端LocalStorage中的Token
    • 后端将Token加入黑名单(Redis)
    • 清除用户会话信息

安全策略

  • 密码加密: 使用bcrypt算法,salt rounds = 10
  • Token签名: 使用HS256算法,密钥定期轮换
  • 登录失败限制: 5分钟内连续失败5次锁定账号30分钟
  • Token黑名单: 登出后的Token加入黑名单,防止重放攻击

接口定义

1. 用户登录

请求

http
POST /v1/sys/auth/login
Content-Type: application/json

{
  "username": "admin",
  "password": "123456",
  "captcha": "a3f8"
}

响应

json
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIs...",
    "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
    "expiresIn": 1800,
    "tokenType": "Bearer",
    "userInfo": {
      "id": "1",
      "username": "admin",
      "nickname": "管理员",
      "avatar": "https://...",
      "roles": ["admin"],
      "permissions": ["*"]
    }
  }
}

2. Token刷新

请求

http
POST /v1/sys/auth/refresh
Authorization: Bearer {refreshToken}

响应

json
{
  "code": 200,
  "message": "刷新成功",
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIs...",
    "expiresIn": 1800,
    "tokenType": "Bearer"
  }
}

3. 用户登出

请求

http
POST /v1/sys/auth/logout
Authorization: Bearer {accessToken}

响应

json
{
  "code": 200,
  "message": "登出成功",
  "data": null
}

4. 获取当前用户信息

请求

http
GET /v1/sys/auth/userinfo
Authorization: Bearer {accessToken}

响应

json
{
  "code": 200,
  "message": "获取成功",
  "data": {
    "id": "1",
    "username": "admin",
    "nickname": "管理员",
    "avatar": "https://...",
    "roles": ["admin"],
    "permissions": ["*"],
    "deptId": "1",
    "deptName": "技术部"
  }
}

测试用例

功能测试

用例编号用例名称前置条件测试步骤预期结果实际结果状态
AUTH-001正常登录用户存在且密码正确1. 输入正确用户名密码
2. 点击登录
登录成功,返回Token符合预期[√] 通过
AUTH-002密码错误用户存在1. 输入错误密码
2. 点击登录
提示密码错误符合预期[√] 通过
AUTH-003用户不存在用户不存在1. 输入不存在的用户名
2. 点击登录
提示用户不存在符合预期[√] 通过
AUTH-004Token刷新已登录且Token未过期1. 调用刷新接口
2. 使用新Token访问
刷新成功,新Token可用符合预期[√] 通过
AUTH-005正常登出已登录1. 点击登出按钮登出成功,清除Token符合预期[√] 通过
AUTH-006Token过期Token已过期1. 使用过期Token访问提示Token过期,自动刷新符合预期[√] 通过

安全测试

用例编号用例名称测试步骤预期结果实际结果状态
AUTH-007SQL注入测试输入 ' OR '1'='1登录失败,无SQL注入风险符合预期[√] 通过
AUTH-008XSS测试输入 <script>alert(1)</script>登录失败,无XSS风险符合预期[√] 通过
AUTH-009暴力破解防护连续输入错误密码5次账号锁定30分钟符合预期[√] 通过
AUTH-010Token伪造测试使用伪造Token访问验证失败,返回401符合预期[√] 通过

开发记录

日期工作内容完成状态
2026-03-27技术方案设计、项目初始化[√] 已完成
2026-03-28登录页面开发、登录API开发[√] 已完成
2026-03-28Token刷新机制实现[√] 已完成
2026-03-28登出功能开发[√] 已完成
2026-03-28单元测试编写、代码审查[√] 已完成
2026-03-29集成测试、Bug修复[√] 已完成

代码统计

指标数值
前端代码行数1,250 行
后端代码行数890 行
测试代码行数420 行
单元测试覆盖率92%
接口数量4 个

相关文档


记录人: 赵六
日期: 2026-03-29

Released under the MIT License.