认证与授权

📎 引用文件

本文引用的文件 - agent/src/api/security.py - agent/src/api/auth_routes.py - agent/src/api/sessions_routes.py - agent/src/session/models.py - agent/src/config/env_schema.py - agent/src/config/accessor.py - agent/api_server.py - agent/tests/test_security_auth_api.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与安全考量
  8. 故障排查指南
  9. 结论
  10. 附录:客户端集成示例

简介

本文件面向 Vibe-Trading API 的认证与授权体系,系统性说明以下主题: - API 密钥管理(来源、校验、回退策略) - 会话认证机制(SSE 票据、浏览器 EventSource 安全流程) - 权限控制策略(本地开发信任、跨站请求防护、敏感操作保护) - 访问控制列表(受保护的端点与鉴权要求) - 认证端点的请求/响应格式与错误处理 - API 密钥生成、轮换与安全存储最佳实践 - 客户端集成示例(Bearer Token、API Key 等) - 安全头部设置、CORS 配置与速率限制策略建议

项目结构

认证相关代码主要分布在以下模块: - 安全中间件与鉴权依赖:security.py - 认证辅助路由(SSE 票据):auth_routes.py - 会话路由(使用鉴权依赖):sessions_routes.py - 会话模型(主体 Principal、认证方法枚举):session/models.py - 环境变量与配置解析:config/env_schema.py、config/accessor.py - 应用装配(CORS、安全头、中间件挂载):api_server.py - 安全回归测试:tests/test_security_auth_api.py

graph TB A["FastAPI 应用<br/>api_server.py"] --> B["CORS 中间件<br/>_CORS_ORIGINS"] A --> C["安全头中间件<br/>_apply_security_headers"] A --> D["DNS 重绑定防护<br/>_reject_untrusted_loopback_host"] A --> E["认证依赖<br/>require_auth / require_event_stream_auth"] E --> F["API Key 校验<br/>_validate_api_auth"] E --> G["SSE 票据校验<br/>_consume_sse_ticket"] A --> H["认证辅助路由<br/>POST /auth/sse-ticket"] A --> I["会话路由<br/>/sessions/*"]

图表来源 - agent/api_server.py:163-182 - agent/src/api/security.py:166-253 - agent/src/api/security.py:343-622 - agent/src/api/auth_routes.py:21-56 - agent/src/api/sessions_routes.py:335-800

章节来源 - agent/api_server.py:163-182 - agent/src/api/security.py:166-253

核心组件

章节来源 - agent/src/api/security.py:343-622 - agent/src/api/auth_routes.py:21-56 - agent/src/config/env_schema.py:245-295 - agent/src/config/env_schema.py:565-577 - agent/src/api/security.py:166-253

架构总览

下图展示从客户端到服务端的关键鉴权路径:浏览器通过 Bearer Token 获取短期 ticket,再使用 ticket 打开 SSE;非浏览器客户端直接使用 Bearer Token。所有敏感接口均受 require_auth 保护。

sequenceDiagram participant Client as "客户端" participant API as "FastAPI 应用" participant Auth as "认证依赖" participant Store as "票据存储" participant Route as "业务路由" Client->>API : "POST /auth/sse-ticket (Authorization : Bearer <key>)" API->>Auth : "require_auth" Auth-->>API : "通过/失败" API->>Store : "_mint_sse_ticket()" Store-->>API : "ticket" API-->>Client : "{ticket}" Client->>API : "GET /sessions/{id}/events?ticket=<ticket>" API->>Auth : "require_event_stream_auth(ticket)" Auth->>Store : "_consume_sse_ticket(ticket)" Store-->>Auth : "有效/无效" Auth-->>API : "通过/失败" API-->>Client : "SSE 事件流"

图表来源 - agent/src/api/auth_routes.py:21-56 - agent/src/api/security.py:318-340 - agent/src/api/security.py:591-622 - agent/src/api/sessions_routes.py:752-800

详细组件分析

认证依赖与策略

flowchart TD Start(["进入 require_auth"]) --> CheckKey{"是否配置 API Key?"} CheckKey --> |是| ValidateToken["提取并验证 Bearer Token"] ValidateToken --> Valid{"验证通过?"} Valid --> |否| Err401["返回 401 未授权"] Valid --> |是| ReturnPrincipal["返回 Principal(共享密钥持有者)"] CheckKey --> |否| IsLocal{"是否本地环回?"} IsLocal --> |是| ReturnLoopback["返回 Principal(本地信任)"] IsLocal --> |否| Err403["返回 403 需要 API Key"]

图表来源 - agent/src/api/security.py:463-504 - agent/src/api/security.py:571-588

章节来源 - agent/src/api/security.py:463-504 - agent/src/api/security.py:571-588 - agent/src/session/models.py:16-37 - agent/src/session/models.py:40-78

SSE 票据机制

sequenceDiagram participant Browser as "浏览器" participant Ticket as "/auth/sse-ticket" participant Store as "票据存储" participant Stream as "SSE 事件流" Browser->>Ticket : "POST (Authorization : Bearer <key>)" Ticket->>Store : "创建 ticket(60s, 单用)" Store-->>Ticket : "ticket" Ticket-->>Browser : "{ticket}" Browser->>Stream : "GET /sessions/{id}/events?ticket=<ticket>" Stream->>Store : "消费并删除 ticket" Store-->>Stream : "有效" Stream-->>Browser : "SSE 事件流"

图表来源 - agent/src/api/auth_routes.py:21-56 - agent/src/api/security.py:303-340 - agent/src/api/security.py:260-297

章节来源 - agent/src/api/auth_routes.py:21-56 - agent/src/api/security.py:303-340 - agent/src/api/security.py:260-297

安全头与 CORS

flowchart TD Req["HTTP 请求"] --> Headers["注入安全头<br/>CSP/X-Frame/..."] Req --> CORS["检查 Origin/Host<br/>匹配白名单"] CORS --> |通过| Next["继续处理"] CORS --> |不通过| Deny["403 拒绝"]

图表来源 - agent/src/api/security.py:180-253 - agent/src/api/security.py:69-103 - agent/src/api/security.py:166-173

章节来源 - agent/src/api/security.py:180-253 - agent/src/api/security.py:69-103 - agent/src/api/security.py:166-173

受保护端点与访问控制列表

classDiagram class SessionRoutes { +create_session() +list_sessions() +get_session() +delete_session() +update_session() +send_message() +cancel_session() +session_events() } class Security { +require_auth() +require_event_stream_auth() +_validate_api_auth() } SessionRoutes --> Security : "依赖"

图表来源 - agent/src/api/sessions_routes.py:335-800 - agent/src/api/security.py:571-622

章节来源 - agent/src/api/sessions_routes.py:335-800

错误处理

章节来源 - agent/src/api/sessions_routes.py:335-800 - agent/src/api/security.py:423-504

依赖关系分析

graph LR Config["EnvConfig<br/>env_schema.py"] --> Sec["Security<br/>security.py"] Sec --> Routes["Sessions/Auth Routes<br/>sessions_routes.py / auth_routes.py"] App["api_server.py"] --> Sec App --> Routes

图表来源 - agent/src/config/env_schema.py:245-295 - agent/src/config/accessor.py:52-76 - agent/src/api/security.py:343-622 - agent/api_server.py:163-182

章节来源 - agent/src/config/env_schema.py:245-295 - agent/src/config/accessor.py:52-76 - agent/src/api/security.py:343-622 - agent/api_server.py:163-182

性能与安全考量

[本节为通用指导,无需特定文件引用]

故障排查指南

章节来源 - agent/tests/test_security_auth_api.py:43-195 - agent/src/api/security.py:260-297

结论

Vibe-Trading 的认证与授权体系以“密钥优先、本地开发信任为辅”为核心原则,结合严格的浏览器安全策略(CSP、CORS、跨站防护)与 SSE 票据机制,既保障了安全性,又兼顾了前端集成的便利性。生产部署应始终配置 API Key,并通过反向代理管理 TLS 与 HSTS。

[本节为总结性内容,无需特定文件引用]

附录:客户端集成示例

使用 Bearer Token 访问敏感接口

参考路径 - agent/src/api/security.py:571-588 - agent/src/config/env_schema.py:245-295 - agent/src/config/env_schema.py:565-577

浏览器使用 EventSource 的认证流程

参考路径 - agent/src/api/auth_routes.py:21-56 - agent/src/api/security.py:303-340 - agent/src/api/security.py:591-622

使用 API Key 作为查询参数(谨慎)

参考路径 - agent/src/api/security.py:369-380

安全头部与 CORS 配置

参考路径 - agent/src/api/security.py:180-253 - agent/src/api/security.py:69-103

速率限制策略(建议)

[本节为通用建议,无需特定文件引用]