引言
目的和范围
模型上下文协议(Model Context Protocol)在传输层提供授权能力, 使 MCP 客户端能够代表资源所有者向受限制的 MCP 服务器发出请求。本规范定义了基于 HTTP 的传输的授权流程。协议要求
授权对于 MCP 实现是可选的。当支持时:- 使用基于 HTTP 的传输的实现应该符合本规范。
- 使用 STDIO 传输的实现不应该遵循本规范,而 应从环境中检索凭证。
- 使用替代传输的实现必须遵循其协议既定的安全最佳 实践。
标准合规性
此授权机制基于以下列出的既定规范,但 实施了其功能的选定子集,以确保安全性和互操作性 同时保持简单性:- OAuth 2.1 IETF 草案 (draft-ietf-oauth-v2-1-13)
- OAuth 2.0 授权服务器元数据 (RFC8414)
- OAuth 2.0 动态客户端注册协议 (RFC7591)
- OAuth 2.0 受保护资源元数据 (RFC9728)
- OAuth 客户端 ID 元数据文档 (draft-ietf-oauth-client-id-metadata-document-00)
- OpenID Connect 动态客户端注册 1.0 (OpenID Connect Registration)
角色
受保护的 MCP 服务器 充当 OAuth 2.1 资源服务器, 能够使用访问令牌接受和响应受保护的资源请求。 MCP 客户端 充当 OAuth 2.1 客户端, 代表资源所有者发出受保护的资源请求。 授权服务器 负责与用户交互(如有必要)并为在 MCP 服务器上使用颁发访问令牌。 授权服务器的实现细节超出了本规范的范围。它可以与 资源服务器一起托管,也可以是单独的实体。授权服务器发现部分 指定了 MCP 服务器如何向客户端指示其对应授权服务器的位置。概述
- 授权服务器必须实施 OAuth 2.1,并为机密客户端和公共客户端采取适当的安全 措施。
- 授权服务器和 MCP 客户端应该支持 OAuth 客户端 ID 元数据文档 (draft-ietf-oauth-client-id-metadata-document-00)。
- 授权服务器和 MCP 客户端可以支持 OAuth 2.0 动态客户端注册 协议 (RFC7591)。
- MCP 服务器必须实施 OAuth 2.0 受保护资源元数据 (RFC9728)。 MCP 客户端必须使用 OAuth 2.0 受保护资源元数据进行授权服务器发现。
-
MCP 授权服务器必须提供以下至少一种发现机制:
- OAuth 2.0 授权服务器元数据 (RFC8414)
- OpenID Connect Discovery 1.0
授权服务器发现
本节描述了 MCP 服务器向其客户端宣传其关联 授权服务器的机制,以及 MCP 客户端确定授权服务器端点和支持能力的发现过程。授权服务器位置
MCP 服务器必须实施 OAuth 2.0 受保护资源元数据 (RFC9728) 规范,以指示授权服务器的位置。MCP 服务器返回的受保护资源元数据文档必须包含authorization_servers 字段,其中包含至少一个授权服务器。
authorization_servers 的具体使用超出了本规范的范围;实施者应咨询
OAuth 2.0 受保护资源元数据 (RFC9728) 以
获取实施细节的指导。
实施者应注意,受保护资源元数据文档
可以定义多个授权服务器。选择使用哪个授权服务器的责任在于 MCP 客户端,
遵循
RFC9728 第 7.6 节“授权服务器” 中指定的指南。
当 authorization_servers 中列出多个授权服务器时,每个都是
独立的 OAuth 2.0 授权服务器。与
RFC 6749 第 2.2 节 一致,客户端
标识符对于颁发它们的授权服务器是唯一的。客户端必须为每个授权服务器维护
单独的注册状态(客户端凭证、令牌),并且
不得假设对一个授权服务器有效的凭证会被另一个授权服务器接受。
受保护资源元数据发现要求
MCP 服务器必须实施以下一种发现机制,以向 MCP 客户端提供授权服务器位置信息:-
WWW-Authenticate 头:在返回
401 Unauthorized响应时,如 RFC9728 第 5.1 节 所述,在WWW-AuthenticateHTTP 头下的resource_metadata中包含资源元数据 URL。 -
Well-Known URI:如 RFC9728 所述,在 well-known URI 上提供元数据。这可以是:
- 在服务器 MCP 端点的路径上:
https://example.com/public/mcp可以在https://example.com/.well-known/oauth-protected-resource/public/mcp托管元数据 - 在根路径上:
https://example.com/.well-known/oauth-protected-resource
- 在服务器 MCP 端点的路径上:
WWW-Authenticate 头中的资源元数据 URL;否则,它们必须回退到按上述顺序构建和请求 well-known URI。
MCP 服务器应该在 WWW-Authenticate 头中包含 scope 参数,如
RFC 6750 第 3 节 所定义,
以指示访问资源所需的范围。这为客户提供了即时
指导,以便在授权期间请求适当的范围,
遵循最小权限原则并防止客户端请求过多的权限。
WWW-Authenticate 质询中包含的范围可以匹配 scopes_supported,是其子集
或超集,或者是既不是严格子集也不是
超集的替代集合。客户端不得假设被质询的
范围集和 scopes_supported 之间存在任何特定的集合关系。客户端必须将质询中提供的范围视为当前操作的权威范围——即,这些范围是满足
当前请求所必需的。当重新授权时,客户端应该将这些范围
与任何先前授予的范围一起包含,以避免丢失其他操作所需的权限
(参见 升级授权流程)。服务器应该努力保持
构建范围集的一致性,但它们不需要通过 scopes_supported 展示每个动态
颁发的范围。
带范围指导的 401 响应示例:
WWW-Authenticate 头并适当响应来自 MCP 服务器的 HTTP 401 Unauthorized 响应。
如果 scope 参数不存在,客户端应该应用 范围选择策略 部分中定义的回退行为。
授权服务器元数据发现
MCP 使用默认的oauth-authorization-server well-known URI
后缀,定义于
RFC 8414 第 3.1 节,
用于授权服务器元数据发现。MCP 不定义
特定于应用程序的 well-known URI 后缀。
为了处理不同的颁发者 URL 格式并确保
与 OAuth 2.0 授权服务器
元数据和 OpenID Connect Discovery 1.0 规范的互操作性,MCP
客户端在发现授权服务器元数据时必须尝试多个 well-known 端点。
发现方法基于
RFC 8414 第 3.1 节“授权服务器元数据请求”
用于 OAuth 2.0 授权服务器元数据发现,以及
RFC 8414 第 5 节“兼容性说明”
用于 OpenID Connect Discovery 1.0 互操作性。
对于带有路径组件的颁发者 URL
(例如,https://auth.example.com/tenant1),客户端必须
按以下优先级顺序尝试端点:
- 带路径插入的 OAuth 2.0 授权服务器元数据:
https://auth.example.com/.well-known/oauth-authorization-server/tenant1 - 带路径插入的 OpenID Connect Discovery 1.0:
https://auth.example.com/.well-known/openid-configuration/tenant1 - 路径追加的 OpenID Connect Discovery 1.0:
https://auth.example.com/tenant1/.well-known/openid-configuration
https://auth.example.com),客户端必须尝试:
- OAuth 2.0 授权服务器元数据:
https://auth.example.com/.well-known/oauth-authorization-server - OpenID Connect Discovery 1.0:
https://auth.example.com/.well-known/openid-configuration
授权服务器发现序列图
下图概述了一个示例流程:客户端注册方法
MCP 支持三种客户端注册机制。根据您的场景选择:- 客户端 ID 元数据文档:当客户端和服务器之间没有预先存在的关系时(最常见)
- 预注册:当客户端和服务器之间存在现有关系时
- 动态客户端注册:用于向后兼容性或特定要求
- 如果客户端可用,使用服务器的预注册客户端信息
- 如果授权服务器表明服务器支持它(通过 OAuth 授权服务器元数据中的
client_id_metadata_document_supported),则使用客户端 ID 元数据文档 - 如果授权服务器支持它(通过 OAuth 授权服务器元数据中的
registration_endpoint),则使用动态客户端注册作为后备方案 - 如果没有其他选项可用,提示用户输入客户端信息
授权服务器绑定
使用预注册凭据或通过动态客户端注册获得的持久化客户端凭据的客户端,MUST 将这些凭据与颁发它们的特定授权服务器关联,以授权服务器的issuer 标识符为键。当授权服务器更改时(通过更新的受保护资源元数据检测到),客户端 MUST NOT 重用来自不同授权服务器的客户端凭据,并且 MUST 向新的授权服务器重新注册。
预注册凭据固有地特定于特定的授权服务器。如果受保护资源元数据指示的授权服务器不再与凭据注册时的服务器匹配,客户端 SHOULD 显示错误,而不是静默尝试使用不匹配的凭据。
基于客户端 ID 元数据文档的客户端 ID 可在授权服务器之间移植,因为它们是授权服务器按需解析的自托管 HTTPS URL。当授权服务器更改时,不需要重新注册。
客户端 ID 元数据文档
MCP 客户端和授权服务器 SHOULD 支持 OAuth 客户端 ID 元数据文档 中指定的 OAuth 客户端 ID 元数据文档。这种方法使客户端能够使用 HTTPS URL 作为客户端标识符,其中 URL 指向包含客户端元数据的 JSON 文档。这解决了服务器和客户端没有预先存在关系的常见 MCP 场景。实现要求
支持客户端 ID 元数据文档的 MCP 实现 MUST 遵循 OAuth 客户端 ID 元数据文档 中指定的要求。关键要求包括: 对于 MCP 客户端:- 客户端 MUST 将其元数据文档托管在遵循 RFC 要求的 HTTPS URL 上
client_idURL MUST 使用 “https” 方案并包含路径组件,例如https://example.com/client.json- 元数据文档 MUST 至少包含以下属性:
client_id、client_name、redirect_uris - 客户端 MUST 确保元数据中的
client_id值与文档 URL 完全匹配 - 客户端 MAY 使用
private_key_jwt进行客户端认证(例如,用于令牌端点的请求),并配合 客户端 ID 元数据文档第 6.2 节 中描述的适当 JWKS 配置
- SHOULD 在遇到 URL 格式的 client_ids 时获取元数据文档
- MUST 验证获取的文档的
client_id与 URL 完全匹配 - SHOULD 缓存元数据并尊重 HTTP 缓存头
- MUST 针对元数据文档中的内容验证授权请求中呈现的重定向 URI
- MUST 验证文档结构是有效的 JSON 并包含必需字段
- SHOULD 遵循 客户端 ID 元数据文档第 6 节 中的安全考虑
元数据文档示例
客户端 ID 元数据文档流程
下图说明了使用客户端 ID 元数据文档时的完整流程:发现
授权服务器通过在其 OAuth 授权服务器元数据中包含以下属性来广告它们支持使用客户端 ID 元数据文档的客户端:预注册
MCP 客户端 SHOULD 支持静态客户端凭据的选项,例如由预注册流程提供的凭据。这可能是:- 硬编码客户端 ID(以及适用的客户端凭据),专门供 MCP 客户端在与该授权服务器交互时使用,或
- 向用户呈现 UI,允许他们在自己注册 OAuth 客户端后输入这些详细信息(例如,通过服务器托管的配置界面)。
动态客户端注册
MCP 客户端和授权服务器 MAY 支持 OAuth 2.0 动态客户端注册协议 RFC7591,以允许 MCP 客户端无需用户交互即可获取 OAuth 客户端 ID。包含此选项是为了与早期版本的 MCP 授权规范向后兼容。应用类型和重定向 URI 约束
当授权服务器支持 OpenID Connect (OIDC) 和动态客户端注册时,它们可能会根据 OpenID Connect 动态客户端注册 1.0 中定义的application_type 参数对重定向 URI 实施额外约束。
MCP 客户端在动态客户端注册期间 MUST 指定适当的 application_type。省略它会在 OIDC 下默认为 "web",这可能与原生风格的重定向 URI 冲突;非 OIDC 服务器安全地忽略该参数。
- 原生应用(桌面应用、移动应用、CLI 工具和通过
localhost访问的本地托管 Web 应用)SHOULD 使用application_type: "native" - Web 应用(从非本地主机提供的远程基于浏览器的应用)SHOULD 使用
application_type: "web"
application_type 或符合授权服务器对给定应用类型要求的重定向 URI 重试注册。
Scope 选择策略
在实现授权流程时,MCP 客户端 SHOULD 遵循最小权限原则,仅请求其预期操作所需的 scope。在初始授权握手期间,MCP 客户端 SHOULD 遵循以下 scope 选择优先级顺序:- 如果 401 响应中的初始
WWW-Authenticate头提供了scope参数,则使用scope参数 - 如果
scope不可用,使用受保护资源元数据文档中scopes_supported定义的所有 scope,如果scopes_supported未定义,则省略scope参数。
scopes_supported 字段旨在表示基本功能所需的最小 scope 集(参见 Scope 最小化),
附加 scope 通过 Scope 挑战处理 部分中描述的逐步授权流程步骤增量请求。
授权流程步骤
完整的授权流程如下所示:资源参数实现
MCP 客户端必须实现 RFC 8707 中定义的 OAuth 2.0 资源指示器,以明确指定请求令牌的目标资源。resource 参数:
- 必须包含在授权请求和令牌请求中。
- 必须标识客户端打算与其一起使用令牌的 MCP 服务器。
- 必须使用 RFC 8707 第 2 节 中定义的 MCP 服务器的规范 URI。
规范服务器 URI
对于本规范的目的,MCP 服务器的规范 URI 定义为 RFC 8707 第 2 节 中指定的资源标识符,并与 RFC 9728 中的resource 参数保持一致。
MCP 客户端应该为其打算访问的 MCP 服务器提供尽可能具体的 URI,遵循 RFC 8707 中的指导。虽然规范形式使用小写的方案和主机组件,但为了健壮性和互操作性,实现应该接受大写的方案和主机组件。
有效规范 URI 示例:
https://mcp.example.com/mcphttps://mcp.example.comhttps://mcp.example.com:8443https://mcp.example.com/server/mcp(当路径组件对于识别单个 MCP 服务器是必要时)
mcp.example.com(缺少方案)https://mcp.example.com#fragment(包含片段)
注意: 虽然例如,如果访问https://mcp.example.com/(带尾随斜杠)和https://mcp.example.com(不带尾随斜杠)根据 RFC 3986 在技术上都是有效的绝对 URI,但除非尾随斜杠对于特定资源具有语义意义,否则实现应该一致地使用不带尾随斜杠的形式以获得更好的互操作性。
https://mcp.example.com 处的 MCP 服务器,授权请求将包括:
访问令牌使用
令牌要求
向 MCP 服务器发出请求时的访问令牌处理必须符合 OAuth 2.1 第 5 节“资源请求” 中定义的要求。 具体而言:- MCP 客户端必须使用 OAuth 2.1 第 5.1.1 节 中定义的 Authorization 请求头字段:
- 访问令牌不得包含在 URI 查询字符串中
令牌处理
MCP 服务器作为 OAuth 2.1 资源服务器,必须按照 OAuth 2.1 第 5.2 节 中所述验证访问令牌。 MCP 服务器必须验证访问令牌是专门为其作为预期受众颁发的,根据 RFC 8707 第 2 节。 如果验证失败,服务器必须根据 OAuth 2.1 第 5.3 节 错误处理要求进行响应。无效或过期的令牌必须收到 HTTP 401 响应。 MCP 客户端不得向 MCP 服务器发送除 MCP 服务器授权服务器颁发的令牌以外的其他令牌。 MCP 服务器必须仅接受对其自身资源有效的令牌。 MCP 服务器不得接受或传输任何其他令牌。刷新令牌
本节为 MCP 客户端和 MCP 服务器在处理或颁发 OAuth 和 OpenID Connect 的刷新令牌时提供指导。 希望使用刷新令牌的MCP 客户端:- 必须按照 OAuth 2.1 第 4.3 节 的规定在传输和存储中保持刷新令牌的机密性
- 应该在其
grant_types客户端元数据中包含refresh_token - 当授权服务器元数据在
scopes_supported中包含offline_access时,可以在授权和令牌请求的scope参数中添加offline_access - 不得假设将颁发刷新令牌;AS 保留酌情权
WWW-Authenticate 范围或受保护资源元数据 scopes_supported 中包含 offline_access,因为刷新令牌不是资源要求。
错误处理
服务器必须为授权错误返回适当的 HTTP 状态码:| 状态码 | 描述 | 用法 |
|---|---|---|
| 401 | 未授权 | 需要授权或令牌无效 |
| 403 | 禁止 | 无效范围或权限不足 |
| 400 | 错误请求 | 授权请求格式错误 |
范围挑战处理
本节涵盖在运行时操作中处理范围不足错误,当客户端已经拥有令牌但需要额外权限时。这遵循 OAuth 2.1 第 5 节 中定义的错误处理模式,并利用 RFC 9728 (OAuth 2.0 受保护资源元数据) 中的元数据字段。运行时范围不足错误
当客户端在运行时操作中使用范围不足的访问令牌发出请求时,服务器应该响应:HTTP 403 Forbidden状态码(根据 RFC 6750 第 3.1 节)- 带有
Bearer方案和附加参数的WWW-Authenticate头:error="insufficient_scope"- 指示特定类型的授权失败scope="required_scope1 required_scope2"- 指定操作所需的最小范围resource_metadata- 受保护资源元数据文档的 URI(与 401 响应保持一致)error_description(可选)- 错误的人类可读描述
scope 参数中包含满足当前操作所需的范围,与 RFC 6750 第 3.1 节 一致。
scope 属性描述访问请求资源所需的范围——服务器不需要包含客户端先前授予的范围。
服务器在确定包含哪些范围方面具有灵活性:
- 最小方法:仅包含触发错误的特定操作所需的范围。
- 推荐方法:包含当前操作所需的范围以及通常一起使用的相关范围,以减少升级授权轮次的数量。
- 扩展方法:包含当前操作所需的范围、相关范围以及服务器预计客户端在不久的将来可能需要的任何其他范围。
跨操作的范围累积是客户端的责任。客户端
应该在发起重新授权时计算先前请求的范围和新挑战范围的并集,如 升级
授权流程 中所述。这允许服务器
相对于客户端范围集保持无状态,同时确保客户端不
丢失先前授予的权限。
升级授权流程
客户端将在初始授权或运行时收到范围相关错误(insufficient_scope)。
客户端应该通过升级授权流程请求具有增加范围集的新访问令牌来响应这些错误,或以其他适当方式处理错误。
代表用户行事的客户端应该尝试升级授权流程。代表自己行事的客户端(client_credentials 客户端)
可以尝试升级授权流程或立即中止请求。
流程如下:
- 解析错误信息 来自授权服务器响应或
WWW-Authenticate头 - 确定所需范围 通过计算客户端先前请求的范围集和当前挑战中的范围的并集。这确保当服务器根据 RFC 6750 第 3.1 节 发出每操作范围挑战时,先前授予的权限得以保留。 客户端可以还咨询 范围选择策略 以获取初始范围选择指导。
- 发起(重新)授权 使用确定的范围集
- 重试原始请求 使用新授权不超过几次,并将其视为永久授权失败
层次结构范围:某些授权服务器定义范围层次结构,
其中较宽的范围隐含较窄的范围(例如,一个
admin 范围
包含 read)。当累积范围时,客户端的并集可能
包含语义冗余条目——例如,先前授予宽范围的令牌可能
被挑战为其已经隐含的较窄范围。客户端无需对层次结构进行去重;授权服务器
通常在令牌颁发期间规范化此类冗余。服务器方面,
在决定令牌是否足以进行操作时必须考虑层次结构,但这不影响它们在
挑战中发出的范围。安全考虑
实现 必须 遵循 OAuth 2.1 第 7 节“安全考虑” 中规定的 OAuth 2.1 安全最佳实践。Token 受众绑定与验证
RFC 8707 资源指示器提供了关键的安全益处,通过 当授权服务器支持该能力时 将令牌绑定到其预期的受众。为了促进当前和未来的采用:- MCP 客户端 必须 在授权和令牌请求中包含
resource参数,如 资源参数实现 部分所指定 - MCP 服务器 必须 验证呈现给它们的令牌是专门为其使用而颁发的
令牌盗窃
获取客户端存储的令牌,或服务器上缓存或记录的令牌的攻击者,可以使用对资源服务器看似合法的请求访问受保护资源。 客户端和服务器 必须 实现安全的令牌存储并遵循 OAuth 最佳实践,如 OAuth 2.1, 第 7.1 节 所述。 授权服务器 应该 颁发短寿命访问令牌以减少令牌泄露的影响。 对于公共客户端,授权服务器 必须 如 OAuth 2.1 第 4.3.1 节“令牌端点扩展” 所述轮换刷新令牌。通信安全
实现 必须 遵循 OAuth 2.1 第 1.5 节“通信安全”。 具体而言:- 所有授权服务器端点 必须 通过 HTTPS 提供服务。
- 所有重定向 URI 必须 是
localhost或使用 HTTPS。
授权码保护
获得授权响应中包含的授权码访问权限的攻击者可以尝试兑换授权码以获取访问令牌,或以其他方式利用授权码。(在 OAuth 2.1 第 7.5 节 中进一步描述) 为了缓解这种情况,MCP 客户端 必须 根据 OAuth 2.1 第 7.5.2 节 实施 PKCE,并且 必须 在进行授权之前验证 PKCE 支持。 PKCE 通过要求客户端创建秘密验证器 - 挑战对,确保只有原始请求者可以将授权码交换为令牌,从而帮助防止授权码拦截和注入攻击。 MCP 客户端 必须 在技术可行时使用S256 代码挑战方法,如 OAuth 2.1 第 4.1.1 节 所要求。
由于 OAuth 2.1 和 PKCE 规范未定义客户端发现 PKCE 支持的机制,MCP 客户端 必须 依赖授权服务器元数据来验证此能力:
-
OAuth 2.0 授权服务器元数据:如果
code_challenge_methods_supported缺失,则授权服务器不支持 PKCE,MCP 客户端 必须 拒绝继续。 -
OpenID Connect Discovery 1.0:虽然 开放身份提供者元数据 未定义
code_challenge_methods_supported,但开放身份提供者通常包含此字段。MCP 客户端 必须 验证提供者元数据响应中code_challenge_methods_supported的存在。如果该字段缺失,MCP 客户端 必须 拒绝继续。
code_challenge_methods_supported 以确保 MCP 兼容性。
开放重定向
攻击者可能制作恶意重定向 URI 将用户引导至钓鱼网站。 MCP 客户端 必须 在授权服务器注册重定向 URI。 授权服务器 必须 针对预注册值验证精确的重定向 URI 以防止重定向攻击。 MCP 客户端 应该 在授权码流中使用并验证状态参数,并丢弃任何不包含或与原始状态不匹配的结果。 授权服务器 必须 采取预防措施防止将用户代理重定向到不可信的 URI,遵循 OAuth 2.1 第 7.12.2 节 中提出的建议。 授权服务器 应该 仅在信任重定向 URI 时自动重定向用户代理。如果 URI 不受信任,授权服务器可以告知用户并依赖用户做出正确的决定。客户端 ID 元数据文档安全
在实现客户端 ID 元数据文档时,授权服务器 必须 考虑 OAuth 客户端 ID 元数据文档,第 6 节 中详述的安全影响。 关键考虑因素包括:授权服务器滥用保护
授权服务器接受来自未知客户端的 URL 作为输入并获取该 URL。 恶意客户端可利用此机制触发授权服务器向任意 URL 发出请求,例如向授权服务器有权访问的私有管理端点发出请求。 获取元数据文档的授权服务器 应该 考虑 服务器端请求伪造 (SSRF) 风险,如 OAuth 客户端 ID 元数据文档:服务器端请求伪造 (SSRF) 攻击 中所述。Localhost 重定向 URI 风险
客户端 ID 元数据文档本身无法防止localhost URL 冒充。攻击者可以通过以下方式声称自己是任何客户端:
- 提供合法客户端的元数据 URL 作为其
client_id - 绑定到任何
localhost端口,并将该地址作为 redirect_uri 提供 - 当用户批准时,通过重定向接收授权码
- 应该 为仅限
localhost的重定向 URI 显示额外警告 - 可以 要求额外的证明机制以增强安全性
- 必须 在授权期间清晰显示重定向 URI 主机名
信任策略
授权服务器 可以 实施基于域的信任策略:- 受信任域名的允许列表(用于受保护服务器)
- 接受任何 HTTPS
client_id(用于开放服务器) - 对未知域名的声誉检查
- 基于域名年龄或证书验证的限制
- 显著显示 CIMD 和其他关联客户端主机名以防止钓鱼
混淆代理问题
攻击者可以利用作为第三方 API 中介的 MCP 服务器,导致 混淆代理漏洞。 通过使用窃取的授权码,他们可以在未经用户同意的情况下获取访问令牌。 使用静态客户端 ID 的 MCP 代理服务器 必须 在转发到第三方授权服务器之前获得每个动态注册客户端的用户同意(这可能需要额外的同意)。访问令牌权限限制
如果服务器接受为其他资源颁发的令牌,攻击者可以获得未经授权的访问或以其他方式危害 MCP 服务器。 此漏洞有两个关键维度:- 受众验证失败。 当 MCP 服务器未验证令牌是否专门为其意图颁发时(例如,通过 RFC9068 中提到的受众声明),它可能接受最初为其他服务颁发的令牌。这破坏了基本的 OAuth 安全边界,允许攻击者跨不同服务重用合法令牌。
- 令牌透传。 如果 MCP 服务器不仅接受具有错误受众的令牌,还将这些未修改的令牌转发给下游服务,它可能会导致 “混淆代理”问题,其中下游 API 可能错误地信任令牌,仿佛它来自 MCP 服务器,或假设令牌已由上游 API 验证。有关详细信息,请参阅安全最佳实践指南的 令牌透传部分。
resource 参数,以明确指定请求令牌的目标资源。此要求与 RFC 9728 第 7.4 节 中的建议一致。这确保访问令牌绑定到其预期的资源,并且不能在不同服务之间被滥用。
MCP 授权扩展
核心协议有几个授权扩展,定义了额外的授权机制。这些扩展具有以下特点:- 可选 - 实现可以选择采用这些扩展
- 增量式 - 扩展不会修改或破坏核心协议功能;它们在保留核心协议行为的同时添加新功能
- 可组合 - 扩展是模块化的,旨在无冲突地协同工作,允许实现同时采用多个扩展
- 独立版本控制 - 扩展遵循核心 MCP 版本控制周期,但可以根据需要采用独立版本控制