Skip to main content
实现参考: 本页面描述的身份验证逻辑在 apps/backend/src/middleware/api-key-oauth.middleware.ts 中实现。

身份验证场景

MetaMCP 支持四种不同的身份验证配置,每种都有特定的行为:

1. API 密钥和 OAuth 都禁用

配置: enable_api_key_auth: false, enable_oauth: false 行为:
  • 所有请求都无需身份验证即可通过
  • 不需要身份验证头
  • 适用于不需要身份验证的公共端点
示例响应:

2. 仅 API 密钥(OAuth 禁用)

配置: enable_api_key_auth: true, enable_oauth: false 行为:
  • 需要通过 X-API-Key 头或查询参数提供有效的 API 密钥
  • 关键问题: 如果 API 密钥缺失或无效,某些 MCP 客户端(如 Inspector)可能会尝试 OAuth 流程
  • 这可能导致无限刷新循环和 429 速率限制错误
有效请求:
无效/缺失 API 密钥响应:
⚠️ 常见问题: MCP Inspector 即使在仅启用 API 密钥时仍可能尝试 OAuth 流程,导致:
  • 无限令牌刷新尝试
  • 429 “请求过多” 错误
  • Inspector 变得无法使用
解决方案: 确保您的 MCP 客户端在禁用 OAuth 时配置为仅使用 API 密钥。确保您提供正确的 API 密钥,否则可能导致 429 速率限制错误。

3. API 密钥和 OAuth 都启用

配置: enable_api_key_auth: true, enable_oauth: true 行为:
  • 接受 API 密钥和 OAuth 承载令牌
  • 如果提供 API 密钥,则优先使用
  • 如果没有提供 API 密钥,则回退到 OAuth
  • 最灵活的配置
身份验证流程:
  1. 未提供令牌: 启动 OAuth 流程
  2. 有效 API 密钥: 通过
  3. 有效 OAuth 令牌: 通过
  4. 无效凭据: 返回 401 并限制速率

4. 仅 OAuth(API 密钥禁用)

配置: enable_api_key_auth: false, enable_oauth: true 行为:
  • 需要 OAuth 承载令牌
  • 不支持 API 密钥
  • 纯 OAuth 身份验证
有效请求:
无令牌响应:
无效令牌响应:

常见问题和解决方案

问题 1: 无限 OAuth 刷新循环

症状:
  • MCP Inspector 持续刷新令牌
  • 429 “请求过多” 错误
  • Inspector 变得无响应
根本原因: MCP 客户端在仅启用 API 密钥时尝试 OAuth 流程 解决方案:
  1. 在端点配置中启用 OAuth:
  2. 配置 MCP 客户端仅使用 API 密钥:
    • 更新客户端配置以使用 X-API-Key
    • 在客户端设置中禁用 OAuth 流程
  3. 使用仅 OAuth 配置:

问题 2: 429 速率限制错误

症状:
  • “身份验证尝试失败次数过多” 错误
  • 因身份验证尝试而临时锁定
解决方案:
  1. 等待速率限制重置(1 分钟)
  2. 如果您启用了身份验证,请确保永远不要传入错误的 API 密钥。

问题 3: 访问被拒绝(403)错误

症状:
  • 即使凭据有效也出现”访问被拒绝”错误
  • “公共 API 密钥无法访问私有端点”消息
根本原因: 基于端点所有权的访问控制 解决方案:
  1. 对于私有端点: 使用端点创建者拥有的 API 密钥
  2. 对于公共端点: 任何有效的 API 密钥或 OAuth 令牌都可以工作
  3. 检查端点所有权:

问题 4: 错误的身份验证方法

症状:
  • 使用 OAuth 时出现”需要通过 API 密钥进行身份验证”
  • 使用 API 密钥时出现”需要通过 OAuth 承载令牌进行身份验证”
解决方案:
  1. 检查端点配置:
  2. 使用正确的身份验证方法:
    • API 密钥: X-API-Key 头或 api_key 查询参数
    • OAuth: Authorization: Bearer