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:
@@ -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 同样存 localStorage,401 时自动触发刷新流程。
|
||||
|
||||
Reference in New Issue
Block a user