# 认证API
**本文档引用的文件**
- [auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
- [auth.service.ts](file://server/src/modules/auth/auth.service.ts)
- [auth.ts](file://server/src/middleware/auth.ts)
- [rate-limiter.ts](file://server/src/middleware/rate-limiter.ts)
- [app.ts](file://server/src/app.ts)
- [errorHandler.ts](file://server/src/middleware/errorHandler.ts)
- [index.ts](file://server/src/types/index.ts)
- [index.ts](file://server/src/config/index.ts)
- [index.ts](file://server/src/models/index.ts)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文件为音频TTS平台的认证模块API文档,涵盖以下三个核心接口:
- 发送验证码接口:POST /api/auth/send-code
- 手机号登录接口:POST /api/auth/login
- 获取用户信息接口:GET /api/auth/user-info
文档详细说明了每个接口的请求参数、响应格式、HTTP状态码和错误处理机制,并提供了完整的请求示例和响应示例,包括成功和失败场景。同时说明了JWT令牌的使用方式和认证头部的设置方法,包含安全考虑、频率限制和最佳实践建议。
## 项目结构
认证模块采用分层架构设计,主要包含以下层次:
```mermaid
graph TB
subgraph "应用层"
Router[路由层]
Controller[控制器层]
end
subgraph "业务逻辑层"
Service[服务层]
end
subgraph "基础设施层"
Middleware[中间件层]
Database[(数据库)]
Redis[(Redis缓存)]
end
subgraph "外部服务"
SMS[短信服务]
Storage[存储服务]
end
Router --> Controller
Controller --> Service
Service --> Database
Service --> Redis
Service --> SMS
Controller --> Middleware
Middleware --> Service
```
**图表来源**
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81)
**章节来源**
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81)
## 核心组件
### 路由与控制器
认证模块通过Koa Router提供RESTful API接口,采用模块化设计,每个接口都有独立的路由处理函数。
### 服务层
服务层封装了核心业务逻辑,包括:
- 验证码生成与验证
- JWT令牌生成与验证
- 用户信息管理
- 数据库操作
### 中间件层
中间件层提供认证、授权、频率限制等横切关注点,确保系统的安全性和稳定性。
**章节来源**
- [auth.controller.ts:10-64](file://server/src/modules/auth/auth.controller.ts#L10-L64)
- [auth.service.ts:10-97](file://server/src/modules/auth/auth.service.ts#L10-L97)
- [auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49)
## 架构概览
认证系统的整体架构如下:
```mermaid
sequenceDiagram
participant Client as 客户端
participant Router as 路由器
participant Controller as 控制器
participant Service as 服务层
participant DB as 数据库
participant Redis as Redis缓存
Client->>Router : HTTP请求
Router->>Controller : 调用对应处理函数
Controller->>Service : 执行业务逻辑
Service->>DB : 查询/更新用户信息
Service->>Redis : 缓存验证码
Service-->>Controller : 返回处理结果
Controller-->>Client : HTTP响应
Note over Client,DB : 认证流程中涉及JWT令牌验证
```
**图表来源**
- [app.ts:100](file://server/src/app.ts#L100)
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
## 详细组件分析
### 发送验证码接口
#### 接口定义
- **URL**: POST /api/auth/send-code
- **功能**: 向指定手机号发送验证码
- **认证**: 无需认证
#### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|--------|------|------|------|------|
| phone | string | 是 | 手机号码 | "13800001111" |
#### 响应格式
**成功响应**:
```json
{
"code": 0,
"message": "验证码发送成功",
"data": {
"phone": "13800001111",
"code": "1234"
}
}
```
**失败响应**:
```json
{
"code": 400,
"message": "请输入正确的手机号",
"data": null
}
```
#### HTTP状态码
- 200: 请求成功
- 400: 参数验证失败
- 500: 服务器内部错误
#### 业务逻辑
```mermaid
flowchart TD
Start([开始]) --> ValidatePhone[验证手机号格式]
ValidatePhone --> PhoneValid{手机号有效?}
PhoneValid --> |否| ReturnError[返回错误]
PhoneValid --> |是| GenerateCode[生成验证码]
GenerateCode --> StoreCode[存储到Redis/内存]
StoreCode --> ReturnSuccess[返回成功响应]
ReturnError --> End([结束])
ReturnSuccess --> End
```
**图表来源**
- [auth.controller.ts:11-30](file://server/src/modules/auth/auth.controller.ts#L11-L30)
- [auth.service.ts:11-19](file://server/src/modules/auth/auth.service.ts#L11-L19)
**章节来源**
- [auth.controller.ts:11-30](file://server/src/modules/auth/auth.controller.ts#L11-L30)
- [auth.service.ts:11-19](file://server/src/modules/auth/auth.service.ts#L11-L19)
### 手机号登录接口
#### 接口定义
- **URL**: POST /api/auth/login
- **功能**: 使用手机号进行登录或注册
- **认证**: 无需认证
#### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|--------|------|------|------|------|
| phone | string | 是 | 手机号码 | "13800001111" |
| code | string | 否 | 验证码 | "123456" |
#### 响应格式
**成功响应**:
```json
{
"code": 0,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "123",
"phone": "13800001111",
"nickname": "用户1111",
"avatar": "https://api.dicebear.com/...",
"memberLevel": 0,
"isNewUser": true
}
}
}
```
**失败响应**:
```json
{
"code": 400,
"message": "验证码错误或已过期",
"data": null
}
```
#### HTTP状态码
- 200: 登录成功
- 400: 验证失败或参数错误
- 500: 服务器内部错误
#### 登录流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant Controller as 控制器
participant Service as 服务层
participant DB as 数据库
Client->>Controller : POST /api/auth/login
Controller->>Controller : 验证手机号格式
Controller->>Service : loginWithPhone(phone, code)
Service->>Service : 验证验证码(可选)
Service->>DB : 查找用户或创建新用户
DB-->>Service : 用户信息
Service->>Service : 生成JWT令牌
Service-->>Controller : 返回登录结果
Controller-->>Client : 返回登录响应
```
**图表来源**
- [auth.controller.ts:33-52](file://server/src/modules/auth/auth.controller.ts#L33-L52)
- [auth.service.ts:44-97](file://server/src/modules/auth/auth.service.ts#L44-L97)
**章节来源**
- [auth.controller.ts:33-52](file://server/src/modules/auth/auth.controller.ts#L33-L52)
- [auth.service.ts:44-97](file://server/src/modules/auth/auth.service.ts#L44-L97)
### 获取用户信息接口
#### 接口定义
- **URL**: GET /api/auth/user-info
- **功能**: 获取当前登录用户的详细信息
- **认证**: 需要JWT认证
#### 请求参数
- 无查询参数
#### 响应格式
**成功响应**:
```json
{
"code": 0,
"message": "success",
"data": {
"id": "123",
"phone": "13800001111",
"nickname": "用户1111",
"avatar": "https://api.dicebear.com/...",
"memberLevel": 0,
"memberExpireAt": "",
"dailyUsage": 0
}
}
```
**失败响应**:
```json
{
"code": 401,
"message": "Token 已过期",
"data": null
}
```
#### HTTP状态码
- 200: 获取成功
- 401: 未授权或Token无效
- 404: 用户不存在
- 500: 服务器内部错误
#### 认证流程
```mermaid
flowchart TD
Start([开始]) --> CheckAuthHeader[检查Authorization头]
CheckAuthHeader --> HasAuth{存在认证头?}
HasAuth --> |否| ReturnUnauthorized[返回401]
HasAuth --> |是| ParseToken[解析Bearer Token]
ParseToken --> VerifyToken[验证JWT令牌]
VerifyToken --> TokenValid{令牌有效?}
TokenValid --> |否| ReturnInvalidToken[返回401]
TokenValid --> |是| GetUser[获取用户信息]
GetUser --> ReturnUserInfo[返回用户信息]
ReturnUnauthorized --> End([结束])
ReturnInvalidToken --> End
ReturnUserInfo --> End
```
**图表来源**
- [auth.ts:20-49](file://server/src/middleware/auth.ts#L20-L49)
- [auth.controller.ts:55-64](file://server/src/modules/auth/auth.controller.ts#L55-L64)
**章节来源**
- [auth.controller.ts:55-64](file://server/src/modules/auth/auth.controller.ts#L55-L64)
- [auth.ts:20-49](file://server/src/middleware/auth.ts#L20-L49)
## 依赖关系分析
### 组件依赖图
```mermaid
graph TB
subgraph "外部依赖"
JWT[jsonwebtoken]
Prisma[Prisma Client]
Redis[Redis]
end
subgraph "内部模块"
AuthController[auth.controller.ts]
AuthService[auth.service.ts]
AuthMiddleware[auth.ts]
ErrorHandler[errorHandler.ts]
RateLimiter[rate-limiter.ts]
Config[config.ts]
Types[index.ts]
Models[index.ts]
end
AuthController --> AuthService
AuthController --> AuthMiddleware
AuthController --> ErrorHandler
AuthService --> Prisma
AuthService --> JWT
AuthService --> Redis
AuthMiddleware --> JWT
AuthMiddleware --> ErrorHandler
RateLimiter --> Redis
Config --> AuthMiddleware
Types --> AuthController
Models --> AuthService
```
**图表来源**
- [auth.controller.ts:1-7](file://server/src/modules/auth/auth.controller.ts#L1-L7)
- [auth.service.ts:1-5](file://server/src/modules/auth/auth.service.ts#L1-L5)
- [auth.ts:1-5](file://server/src/middleware/auth.ts#L1-L5)
- [rate-limiter.ts:1-2](file://server/src/middleware/rate-limiter.ts#L1-L2)
### 数据流分析
```mermaid
erDiagram
USER {
int id PK
string phone
string nickname
string avatar
int memberLevel
int dailyUsage
string lastUsageDate
datetime createdAt
datetime updatedAt
}
SMS_CODE {
string phone PK
string code
datetime expireAt
}
JWT_TOKEN {
string userId
string phone
datetime iat
datetime exp
}
USER ||--o{ JWT_TOKEN : "拥有"
USER ||--o{ SMS_CODE : "关联"
```
**图表来源**
- [index.ts:4-16](file://server/src/types/index.ts#L4-L16)
- [auth.service.ts:7-32](file://server/src/modules/auth/auth.service.ts#L7-L32)
**章节来源**
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81)
## 性能考虑
### 频率限制策略
系统实现了多层级的频率限制机制:
| 限制类型 | 配置 | 说明 |
|----------|------|------|
| 全局限流 | 100次/分钟 | 对整个API进行总体限制 |
| 登录接口 | 5次/分钟 | 防止暴力破解 |
| 验证码发送 | 1次/分钟 | 防止短信轰炸 |
| TTS生成 | 20次/分钟 | 根据用户等级限制 |
| 文件上传 | 10次/分钟 | 限制上传频率 |
### 缓存策略
- **验证码缓存**: 使用内存Map存储,生产环境建议使用Redis
- **用户会话**: JWT令牌存储在客户端,减少服务器状态
- **配置缓存**: 应用启动时加载并缓存配置信息
### 性能优化建议
1. **Redis迁移**: 生产环境建议将验证码存储从内存迁移到Redis
2. **连接池**: 使用数据库连接池提高并发性能
3. **缓存预热**: 对热点用户信息进行缓存预热
4. **异步处理**: 将耗时操作(如短信发送)改为异步处理
## 故障排除指南
### 常见错误及解决方案
#### 认证相关错误
| 错误类型 | HTTP状态码 | 错误信息 | 解决方案 |
|----------|------------|----------|----------|
| 缺少认证头 | 401 | 缺少 Authorization 头 | 在请求头添加Authorization: Bearer |
| Token格式错误 | 401 | Authorization 格式错误 | 确保使用Bearer前缀和有效的JWT令牌 |
| Token过期 | 401 | Token 已过期 | 重新登录获取新令牌 |
| Token无效 | 401 | Token 无效 | 检查令牌签名和有效期 |
#### 业务逻辑错误
| 错误类型 | HTTP状态码 | 错误信息 | 解决方案 |
|----------|------------|----------|----------|
| 手机号格式错误 | 400 | 请输入正确的手机号 | 验证手机号格式为11位数字 |
| 验证码错误 | 400 | 验证码错误或已过期 | 检查验证码是否正确且未过期 |
| 用户不存在 | 404 | 用户不存在 | 确认用户已注册或重新登录 |
#### 频率限制错误
| 错误类型 | HTTP状态码 | 错误信息 | 解决方案 |
|----------|------------|----------|----------|
| 请求过于频繁 | 429 | 请求过于频繁,请稍后再试 | 等待Retry-After指定的时间后重试 |
### 调试技巧
1. **开发环境认证**: 设置环境变量`AUTH_ENABLED=false`可跳过认证
2. **详细错误日志**: 开发环境下会返回完整的错误堆栈信息
3. **请求追踪**: 使用Sentry进行错误监控和追踪
**章节来源**
- [auth.ts:8-18](file://server/src/middleware/auth.ts#L8-L18)
- [errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24)
- [rate-limiter.ts:60-71](file://server/src/middleware/rate-limiter.ts#L60-L71)
## 结论
认证模块提供了完整的移动端用户认证解决方案,具有以下特点:
### 安全特性
- JWT令牌认证机制
- 多层频率限制
- 输入参数验证
- XSS和SQL注入防护
### 可扩展性
- 模块化设计便于维护
- 中间件架构支持功能扩展
- 配置驱动的认证策略
### 最佳实践建议
1. **生产环境部署**: 启用认证中间件,使用Redis存储验证码
2. **安全配置**: 使用强密码学密钥,定期轮换JWT密钥
3. **监控告警**: 集成Sentry进行错误监控,设置合理的告警阈值
4. **性能优化**: 实施缓存策略,使用连接池和异步处理
该认证模块为音频TTS平台提供了可靠的基础设施,支持后续功能的扩展和演进。