Skip to content

[P0][T05] 为 MCP OAuth 提供失败关闭模式并避免下游异常二次发送 #5

Closed

Description

@Aias00

目标

OAuth 必需场景拿不到 token 时不得发送请求,下游 exchange 异常也不得触发无认证重发。

优先级与归属

范围与落地方案

  • 在 McpGatewayOAuthInterceptor 增加显式严格选项;保持 OAuth disabled 与旧配置兼容。
  • 收窄 token 获取错误处理范围,不把 next.exchange 错误当 token 获取失败。
  • 空 token/取 token 异常给出明确失败;401 缓存清理不得自动复制有副作用的请求。

前置依赖

  • 无前置 Task;可以独立推进。

验收条件

  • 严格模式下 token empty/error 时 next.exchange 调用次数为零。
  • 有效 token 后下游异常只发送一次,且不会出现无认证 fallback 请求。
  • OAuth disabled 正常透传;兼容模式行为有独立测试。
  • 日志不输出 token/secret;文档说明严格模式启用方式与迁移边界。

非目标

  • 不声称已证明后端鉴权绕过漏洞,不增加 end-user IAM。

兼容与验证约束

  • Java 17;新增路径显式启用,保留既有 API、默认行为、checkpoint/Store 格式及配置前缀。
  • Core 不引入 Redis/Extensions 依赖;存储实现归 Extensions,应用接线归可选运行层。
  • 首阶段无 MQ、整 Run Worker,不做节点分片,不承诺通用 exactly-once 或 Redis HA RPO0。
  • 先用模型无关单测/reference 验证本任务,再按范围运行现有 API/格式门禁;涉及 Redis 用真实存储测试,涉及接管用独立 JVM。

当前实现依据

分析基线:Core 6324f53、Extensions ed07835;AgentScope 参考 c95eb1f。本 Issue 是待完成任务,不代表能力已经实现。

Activity

  1. added theissue type on Oct 8, 2026
  2. Koiyd commented on Oct 15, 2026

    @Koiyd
    Contributor

    我来认领这个任务。

    修复方案

    1. 下游异常二次发送:无条件修复。 把错误处理收窄到 token 获取阶段,next.exchange 之后不再挂 onErrorResume。下游异常直接向上传播,同一请求只发一次。这是纯 bug,不受任何开关控制。
    2. token 缺失时的降级:按 issue 方案新增显式严格选项。 在 McpGatewayOAuthProperties 增加 strictMode 字段,默认 true。
      • 严格模式下 token 为空或获取异常时返回 Mono.error,next.exchange 零调用。
      • 兼容模式保留现有降级行为。
      • OAuth disabled 时照常透传。
    3. 401 响应只清理缓存 token,不自动重放请求,避免复制有副作用的调用。

    严格模式的默认值
    我认为应该默认开启严格模式。用户显式开启了 OAuth,就是要求请求必须带认证。token 拿不到时静默发出无认证请求,违背了这个配置意图,而且只有一条 warn 日志,很难在生产环境察觉。 @Aias00

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingpriority/critical-urgent最高优先级:需立即投入处理的阻塞或严重问题

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions