跳转至

MCP 身份验证

MCP 授权的工作原理

MCP Authorization 规范建立在标准 OAuth 2.0 之上,各角色划分如下:

  • 您的 MCP 服务器 是 OAuth 的资源服务器(resource server),它从不处理密码,只验证访问令牌。
  • Authany 是授权服务器(authorization server),负责让用户登录、展示授权同意页并签发令牌。
  • 每个用户的 MCP 客户端(例如 Claude 这样的 AI 助手,或某个 IDE 代理)都是一个 OAuth 客户端,它会发现您的授权服务器,并在首次使用时通过 Dynamic Client Registration自行注册。

完成以下配置后,整个端到端流程将全自动运行:

  1. MCP 客户端在没有令牌的情况下调用您的 MCP 服务器,收到 401 Unauthorized 响应,其中的 WWW-Authenticate 头指向服务器的 Protected Resource Metadata(RFC 9728)。
  2. 该元数据将您的 Authany 项目指定为授权服务器。客户端获取 Authany 的发现文档,并从中找到 registration_endpoint。
  3. 客户端通过 DCR 自行注册,并获得一个 client_id。
  4. 客户端使用 PKCE 运行 Authorization Code Flow,并传入 resource=<your MCP server URI>。用户通过 Authany 登录,并在授权同意页上批准所请求的作用域。
  5. Authany 签发一个访问令牌,其 aud 声明为您的 MCP 服务器 URI。客户端携带该令牌重新发起 MCP 请求;您的服务器验证令牌后提供相应工具。

为 MCP 服务器配置 Authany

1. 将 MCP 服务器注册为 API 资源

在管理台中,进入 API 资源,为您的 MCP 服务器创建一个资源:

  • 将 标识符 设置为 MCP 服务器的规范 URI,例如 https://mcp-server.example.com。这就是 MCP 客户端作为 resource 发送的值,也是您的服务器将要验证的 aud。
  • 添加工具所需的 权限范围(Scope),例如 read:tools 和 execute:tools。

2. 向动态客户端开放该资源

MCP 客户端属于动态第三方客户端,因此需要显式授予它们访问权限:

  • 在该资源的详情页中,开启 Allow dynamic third-party clients。
  • 对于要允许 MCP 客户端请求的每个权限范围,勾选 Allow dynamic third-party clients to request this scope。

3. 启用开放注册的 Dynamic Client Registration

进入 应用 → Dynamic clients (DCR) 标签页:

  • 开启 Enable dynamic client registration,然后点击 Save。
  • 在 Registration security 下,关闭 Require initial access token。通用的 MCP 客户端无法获取或提供初始访问令牌;若开启该要求,它们的注册请求会以 403 access_denied 失败。

说明

开放注册意味着任何人都可以在您的项目中注册客户端。已注册的客户端在真实用户登录并同意授权之前无法执行任何操作,并且只能请求您在步骤 2 中开放的资源和权限范围。

配置 MCP 服务器端

以下两件事需要在您的 MCP 服务器上完成,而不是在 Authany 中:

提供 Protected Resource Metadata。 在 /.well-known/oauth-protected-resource 路径下托管一个文档,将您的 Authany 项目指定为授权服务器,并在每个 401 响应中引用它:

{
  "resource": "https://mcp-server.example.com",
  "authorization_servers": ["https://myproject.authanyid.com"],
  "scopes_supported": ["read:tools", "execute:tools"]
}
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp-server.example.com/.well-known/oauth-protected-resource"

验证访问令牌,在每个 MCP 请求中执行:

  1. 确认令牌是一个 JWT。
  2. 从 https://myproject.authanyid.com/.well-known/openid-configuration 获取 jwks_uri,并验证签名。
  3. 检查 iss 是否等于您的 Authany 项目端点。
  4. 检查 aud 是否包含您的 MCP 服务器 URI(https://mcp-server.example.com)。这项检查可防止发给其他受众的令牌被重放到您的服务器上。
  5. 检查令牌是否尚未过期(exp),以及其 scope 是否覆盖所请求的工具。

有关步骤 1–5 的各语言示例,请参阅在后端验证 JWT。

端到端试运行

真实的 MCP 客户端会自动完成上述所有流程,但您也可以手动走一遍流程来验证配置。注册一个客户端:

curl https://myproject.authanyid.com/oauth2/register \
  -H 'Content-Type: application/json' \
  -d '{"redirect_uris": ["https://mcp-client.example.com/callback"]}'

然后使用返回的 client_id,运行带 PKCE 的 Authorization Code Flow,请求您的权限范围并指定资源:

GET https://myproject.authanyid.com/oauth2/authorize
  ?client_id=dcrc_AbCdEfGhIjKlMnOpQr
  &response_type=code
  &scope=openid+read:tools
  &redirect_uri=https://mcp-client.example.com/callback
  &code_challenge=<challenge>
  &code_challenge_method=S256
  &resource=https://mcp-server.example.com

登录并同意授权后,在 /oauth2/token 处用相同的 code_verifier、redirect_uri 和 resource 兑换 code。解码得到的访问令牌,确认 aud 为 ["https://mcp-server.example.com"],与您的 MCP 服务器所验证的一致。

运维说明

  • 每个自行注册的 MCP 客户端都会出现在 应用 → Dynamic clients (DCR) → View all 中,您可以在那里查看其元数据或将其删除。
  • 用户管理 MCP 客户端授权的方式,与管理其他第三方应用相同;授权同意页会显示 MCP 客户端所请求的权限范围。
  • 所有动态注册客户端的令牌有效期,均在 DCR 标签页的 Default client configuration 卡片中设置。