一个支持多 token 轮询和多用户认证的 API 代理服务,支持 SSE 流式转发。
- 多用户 token 认证
- 多后端 token 轮询使用
- 自动检测失效 token(非 200 响应)
- 失效 token 1 小时后自动恢复
- 使用 GORM + SQLite 存储数据
- 支持 SSE(Server-Sent Events)流式转发
- 提供管理接口
export TARGET_URL="https://api.example.com" # 目标 API 地址
export PORT="8080" # 可选,默认 8080go run main.gocurl -X POST http://localhost:8080/admin/users \
-H "Content-Type: application/json" \
-d '{"username": "user1", "email": "user1@example.com"}'# 生成永不过期的 token
curl -X POST http://localhost:8080/admin/users/1/tokens \
-H "Content-Type: application/json" \
-d '{"name": "my-token"}'
# 生成 30 天后过期的 token
curl -X POST http://localhost:8080/admin/users/1/tokens \
-H "Content-Type: application/json" \
-d '{"name": "my-token", "expires_in": 2592000}'curl http://localhost:8080/admin/userscurl http://localhost:8080/admin/users/1/tokenscurl -X POST http://localhost:8080/admin/tokens \
-H "Content-Type: application/json" \
-d '{"name": "backend-token-1", "token": "your-backend-token-here"}'curl http://localhost:8080/admin/tokens使用用户 token 访问代理服务:
curl http://localhost:8080/your/api/path \
-H "Authorization: Bearer <user-token>"- 用户请求到达代理服务,携带用户 token
- 认证中间件验证用户 token 是否有效
- 从后端 token 池中轮询选择一个可用的 token
- 将请求转发到目标 URL,使用后端 token 作为 Authorization header
- 如果响应状态码非 200,标记该后端 token 为无效
- 无效的后端 token 在 1 小时后自动恢复可用状态
- 直接流式转发响应体,支持 SSE
使用 SQLite 存储数据,数据库文件:.data/gorm.db
- ID: 主键
- Username: 用户名(唯一)
- Email: 邮箱(唯一)
- IsActive: 是否激活
- CreatedAt: 创建时间
- UpdatedAt: 更新时间
- ID: 主键
- UserID: 用户 ID
- Token: token 字符串(唯一)
- Name: token 名称
- ExpiresAt: 过期时间
- LastUsedAt: 最后使用时间
- CreatedAt: 创建时间
- UpdatedAt: 更新时间
- ID: 主键
- Name: token 名称
- Token: token 字符串(唯一)
- IsValid: 是否有效
- InvalidatedAt: 失效时间
- LastUsedAt: 最后使用时间
- CreatedAt: 创建时间
- UpdatedAt: 更新时间
POST /admin/users- 创建用户GET /admin/users- 列出所有用户GET /admin/users/:id- 获取用户详情DELETE /admin/users/:id- 删除用户POST /admin/users/:id/tokens- 为用户生成 tokenGET /admin/users/:id/tokens- 列出用户的所有 tokenDELETE /admin/user-tokens/:id- 删除用户 token
POST /admin/tokens- 添加后端 tokenGET /admin/tokens- 列出所有后端 tokenDELETE /admin/tokens/:id- 删除后端 token