Merge pull request 'docs: 添加令牌桶限流模块设计文档' (#158) from feature/ratelimite into develop

Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/158
This commit was merged in pull request #158.
This commit is contained in:
2026-06-20 20:36:21 +08:00
5 changed files with 1160 additions and 6 deletions

View File

@@ -210,7 +210,7 @@ graph LR
| Models | 数据模型定义 |
| Migrations | 数据库版本化迁移,嵌入式 SQL 文件自动执行 |
| Model Router | 根据请求类型选择 AI 模型(待实现) |
| Rate Limiter | 令牌桶限流(待实现) |
| Rate Limiter | 令牌桶限流。详细设计见 [令牌桶限流设计](./13-令牌桶限流设计.md) |
## 前端组件
@@ -377,6 +377,19 @@ TieredManager
## 认证设计
采用 **JWT 双 token 轮转认证机制**,结合 bcrypt 密码哈希和 Refresh Token Rotation 安全策略。详细设计见 [鉴权体系设计](./12-鉴权体系设计.md)。
### 核心组件
| 组件 | 职责 |
|------|------|
| TokenManager | JWT 生成与验证HS256 算法) |
| AuthService | 认证业务逻辑(注册/登录/刷新/登出) |
| AuthMiddleware | Gin 中间件,校验 access_token 并注入用户信息 |
| PasswordUtil | bcrypt 密码哈希cost=10 |
### 认证流程
```mermaid
sequenceDiagram
participant C as 客户端
@@ -409,9 +422,45 @@ sequenceDiagram
G-->>C: {access_token, refresh_token}
```
**Token 策略**access_token 15 分钟有效refresh_token 7 天有效。refresh 时旧 token 失效(轮转),防止重放攻击。
### Token 策略
**WebSocket 认证**:连接地址 `ws://host/ws?token=<access_token>&conversation_id=<uuid>`。HTTP Upgrade 前校验 token失败返回 401。
- **access_token**15 分钟有效,用于 API 认证和 WebSocket 连接
- **refresh_token**7 天有效,用于刷新 access_token
- **Refresh Token Rotation**:每次 refresh 都生成新的 token pair旧 refresh_token 立即失效
- **复用检测**:检测到已删除的 refresh_token 被复用时,吊销该用户的所有 refresh_token
### 安全机制
1. **密码安全**bcrypt 算法cost=10自动生成盐值防彩虹表攻击
2. **Token 安全**
- access_token 短有效期15 分钟),降低泄露风险
- refresh_token 使用 SHA256 哈希存储,不存储原始 token
- Refresh Token Rotation 防重放攻击
- 复用检测 + 自动吊销机制
3. **传输安全**HTTPS 强制CORS 限制HttpOnly Cookie 存储 refresh_token
4. **防攻击策略**
- 防暴力破解:可选速率限制
- 防枚举攻击:统一错误信息
- 防 Token 泄露:复用检测 + 自动吊销
### WebSocket 认证
连接地址:`ws://host/ws?token=<access_token>&conversation_id=<uuid>`
- HTTP Upgrade 前校验 token
- 校验失败返回 401 Unauthorized
- 校验成功后user_id 和 username 注入到连接上下文
### 配置
```yaml
auth:
jwt_secret: "" # JWT 签名密钥(必须通过 CAMTALK_AUTH_JWT_SECRET 环境变量设置)
access_ttl: 15 # access_token 有效期(分钟)
refresh_ttl: 10080 # refresh_token 有效期分钟7天
```
> **安全要求**`JWT_SECRET` **必须**通过环境变量设置,不能写入配置文件。生产环境使用 `openssl rand -hex 32` 生成随机密钥。
## 部署架构