feat: 扩展 Config 结构体,新增 AuthConfig 配置

- 新增 AuthConfig 结构体(JWTSecret, AccessTTL, RefreshTTL)
- 在 Config 中添加 Auth 字段
- 设置默认值:access_ttl=15分钟,refresh_ttl=10080分钟(7天)
- JWTSecret 必须通过环境变量 CAMTALK_AUTH_JWT_SECRET 设置
This commit is contained in:
hhs
2026-06-14 16:40:06 +08:00
parent 07211675e9
commit 4b30e67c2e
4 changed files with 1640 additions and 0 deletions

View File

@@ -13,6 +13,12 @@
│ ├── LLM: GPT-4o默认 / 通义千问等 OpenAI 兼容模型
│ └── TTS: OpenAI TTS默认 / MiMo TTS
├── 持久化层 → 数据库选型: PostgreSQL规划中MVP 阶段使用内存存储)
├── 认证与用户系统
│ ├── 认证方案: JWT (HS256), access 15min + refresh 7day
│ ├── JWT 库: golang-jwt/jwt/v5
│ ├── 密码哈希: bcrypt
│ ├── 数据库驱动: pgx/v5手写 SQL不用 ORM
│ └── 前端 Token 存储: localStorage
└── 前端边缘处理层
├── 边缘推理: ONNX Runtime Web规划中MVP 使用 Canvas 像素比较)
├── 语音检测: @ricky0123/vad-web
@@ -214,3 +220,80 @@ vad-web 是"够用且最轻"的平衡点——直接包装浏览器原生 WebRTC
| MediaDevices API | 直接用浏览器原生接口,不加封装层 |
与"前端做轻量预处理"原则一致:前端层只需采集和判断"有没有值得发给后端的数据"。
---
## 四、认证与用户系统选型
### 总览
| 能力 | 选型 | 选择理由 |
|------|------|---------|
| 认证方案 | JWT (HS256) | 无状态,分布式友好,实现简单 |
| JWT 库 | golang-jwt/jwt/v5 | 社区主流v5 活跃维护 |
| 密码哈希 | bcrypt | Go 标准库直接可用,安全性足够 |
| 数据库驱动 | pgx/v5 | Go 生态性能最优的 PostgreSQL 驱动 |
| 数据库迁移 | 手写 SQL | MVP 阶段足够,后续可引入 golang-migrate |
### 认证方案JWT
| 方案 | 特点 | 适用场景 |
|------|------|---------|
| **JWT (HS256)** | 无状态 token服务端不存 session水平扩展友好 | 分布式部署、前后端分离 |
| Session + Cookie | 有状态,服务端存 session通常 Redis | 传统 Web 应用、需要服务端控制会话 |
| OAuth2 | 第三方登录授权 | 需要接入微信/GitHub 等第三方登录 |
选择 JWT 的核心理由:项目架构是前后端分离 + WebSocket 长连接JWT 无需服务端维护 session 状态天然适配。HS256 对称签名足以满足安全需求,实现比 RS256 简单。
Token 策略采用 **access (15min) + refresh (7day) 双 token**access_token 短生命周期降低泄露风险refresh_token 支持无感续期。
### JWT 库golang-jwt/jwt/v5
| 方案 | 状态 | 特点 |
|------|------|------|
| **golang-jwt/jwt/v5** | 活跃维护 | dgrijalva/jwt-go 的官方继任,社区主流 |
| dgrijalva/jwt-go | 已停维护 | 原始库,不再更新 |
| lestrrat-go/jwx | 活跃 | 功能更全JWE/JWS但项目只需签名过度引入 |
v5 是 Go 生态中 JWT 的事实标准API 简洁,文档完善。
### 密码哈希bcrypt
| 方案 | 特点 | 选择理由 |
|------|------|---------|
| **bcrypt** | 自适应 cost factor抗暴力破解 | Go 标准库 `golang.org/x/crypto/bcrypt` 直接可用 |
| argon2 | 2015 年密码哈希竞赛冠军,抗 GPU/ASIC | 安全性更高,但 Go 生态库不如 bcrypt 成熟 |
| scrypt | 内存硬哈希 | 参数调优复杂bcrypt 已足够 |
bcrypt 的 `cost` 参数可随硬件升级调大,当前默认 cost=10 足够安全。
### 数据库驱动pgx/v5
| 方案 | 特点 | 适用场景 |
|------|------|---------|
| **pgx/v5** | 原生 PostgreSQL 协议实现,连接池 pgxpool性能最优 | 需要高性能、直接写 SQL |
| GORM | 全功能 ORM自动迁移、关联预加载 | 快速开发、不想写 SQL |
| Ent | Facebook 出品,类型安全的 ORM | 大型项目、强类型需求 |
| database/sql + lib/pq | 标准接口,但 lib/pq 已停维护 | 简单场景 |
项目规模不大4 张表),手写 SQL 更可控,避免 ORM 的抽象泄漏和性能黑盒。pgx 原生支持 `pgxpool` 连接池,无需额外引入。
### 数据库迁移:手写 SQL
| 方案 | 特点 | 适用场景 |
|------|------|---------|
| **手写 SQL** | 零依赖,完全可控 | 表少(<10 张)、团队小 |
| golang-migrate | CLI + 库双模式,支持版本回滚 | 表多、需要严格版本管理 |
| Atlas | 声明式迁移HCL 定义 schema | 大型项目、多环境管理 |
MVP 阶段 4 张表,手写 `schema.sql` 即可。后续表结构复杂后可引入 golang-migrate。
### 前端 Token 存储
| 方案 | 特点 | 选择理由 |
|------|------|---------|
| **localStorage** | 持久化存储刷新不丢失JS 可直接读写 | 简单直接SPA 应用标准做法 |
| httpOnly Cookie | 防 XSS 读取,但需防 CSRF | 传统 Web 应用,需额外 CSRF 防护 |
| sessionStorage | 仅当前标签页有效 | 关闭标签页需重新登录,体验差 |
JWT 存 localStorage配合请求拦截器统一附加 `Authorization: Bearer <token>` header。refresh_token 同样存 localStorage401 时自动触发刷新流程。