MCP 身份验证¶
MCP 授权的工作原理 ¶
MCP Authorization 规范建立在标准 OAuth 2.0 之上,各角色划分如下:
- 您的 MCP 服务器 是 OAuth 的资源服务器(resource server),它从不处理密码,只验证访问令牌。
- Authany 是授权服务器(authorization server),负责让用户登录、展示授权同意页并签发令牌。
- 每个用户的 MCP 客户端(例如 Claude 这样的 AI 助手,或某个 IDE 代理)都是一个 OAuth 客户端,它会发现您的授权服务器,并在首次使用时通过 Dynamic Client Registration自行注册。
完成以下配置后,整个端到端流程将全自动运行:
- MCP 客户端在没有令牌的情况下调用您的 MCP 服务器,收到
401 Unauthorized响应,其中的WWW-Authenticate头指向服务器的 Protected Resource Metadata(RFC 9728)。 - 该元数据将您的 Authany 项目指定为授权服务器。客户端获取 Authany 的发现文档,并从中找到
registration_endpoint。 - 客户端通过 DCR 自行注册,并获得一个
client_id。 - 客户端使用 PKCE 运行 Authorization Code Flow,并传入
resource=<your MCP server URI>。用户通过 Authany 登录,并在授权同意页上批准所请求的作用域。 - 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 请求中执行:
- 确认令牌是一个 JWT。
- 从
https://myproject.authanyid.com/.well-known/openid-configuration获取jwks_uri,并验证签名。 - 检查
iss是否等于您的 Authany 项目端点。 - 检查
aud是否包含您的 MCP 服务器 URI(https://mcp-server.example.com)。这项检查可防止发给其他受众的令牌被重放到您的服务器上。 - 检查令牌是否尚未过期(
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 卡片中设置。