Skip to content

feat(service-ai): Add auth middleware metadata to AI route definitions #1008

@hotlong

Description

@hotlong

当前 buildAIRoutes() 返回的 RouteDefinition 不包含任何认证/授权元数据。8 条 AI 路由直接暴露,无法区分:

  • 需要认证的路由(如 POST /api/v1/ai/chat
  • 公开路由(如 GET /api/v1/ai/models 可能允许匿名)
  • 需要特定权限的路由(如 conversation 管理可能需要 ai:manage 权限)

任务

  1. 扩展 RouteDefinition 接口(packages/services/service-ai/src/routes/ai-routes.ts):

    export interface RouteDefinition {
      method: 'GET' | 'POST' | 'DELETE';
      path: string;
      description: string;
      handler: (req: RouteRequest) => Promise<RouteResponse>;
      // ── 新增 ──
      /** Whether authentication is required (default: true) */
      auth?: boolean;
      /** Required permission scopes */
      permissions?: string[];
    }
  2. 为每条路由标注 auth 和 permissions:

    Route auth permissions
    POST /api/v1/ai/chat true ['ai:chat']
    POST /api/v1/ai/chat/stream true ['ai:chat']
    POST /api/v1/ai/complete true ['ai:complete']
    GET /api/v1/ai/models false []
    POST /api/v1/ai/conversations true ['ai:conversations']
    GET /api/v1/ai/conversations true ['ai:conversations']
    POST .../conversations/:id/messages true ['ai:conversations']
    DELETE .../conversations/:id true ['ai:conversations:delete']
  3. 扩展 RouteRequest 增加 user context:

    export interface RouteRequest {
      body?: unknown;
      params?: Record<string, string>;
      query?: Record<string, string>;
      // ── 新增 ──
      /** Authenticated user context (populated by auth middleware) */
      user?: { id: string; roles?: string[]; permissions?: string[] };
    }
  4. Conversation 路由增加 ownership 校验GET /conversationsDELETE /conversations/:id 应仅返回/操作当前用户的对话

  5. 新增测试验证 auth metadata 正确性

  6. 更新 CHANGELOG.md

说明

  • 实际的 auth 中间件由 HTTP server plugin(如 plugin-hono-server)在消费 ai:routes hook 时挂载
  • service-ai 只负责 声明 auth 需求,不负责 执行 auth 逻辑
  • 这与 ObjectStack 的 "协议声明 + 运行时注入" 架构模式一致

验收标准

  • RouteDefinition 包含 authpermissions 字段
  • 所有 8 条路由标注了正确的 auth 元数据
  • RouteRequest 包含可选的 user context
  • conversation 路由有 ownership 意识
  • 新增 ≥5 个测试用例
  • 全部测试通过

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions