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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions