Skip to content
🔗 分享本题
查看我的学习进度 →

MCP PRM OAuth与DPoP授权流程图解

🧠 图解记忆: PRM 负责发现,OAuth 负责授权,DPoP 证明令牌由原客户端持有。

💡 答案要点

MCP 授权的特殊性:

MCP Server 持有敏感资源(用户数据、数据库、管理接口),但 Server 不知道自己该信任谁——这是 Client 的用户要来访问。这和传统 API 的"已知客户端"场景不同,需要一个完整的授权流程来建立互信。

MCP 授权三件套:

组件作用对应标准
PRM(Protected Resource Metadata)Server 告诉 Client"授权服务器在哪"RFC 9728
OAuth 2.1标准授权协议(Authorization Code + PKCE)RFC 6749 + 7636
DPoP(Demonstrating Proof of Possession)绑定 Token 到客户端密钥,防 Token 被盗滥用RFC 9449

完整授权流程(Step by Step):

1️⃣ Client 连接 Server → Server 返回 401 + WWW-Authenticate Header

                     resource_metadata="https://server.com/.well-known/oauth-protected-resource"

2️⃣ Client 获取 PRM 文档 → 知道授权服务器、支持的 Scopes

3️⃣ Client 通过 OIDC Discovery → 找到授权服务器的 endpoints

4️⃣ Client 注册(或预注册)到授权服务器

5️⃣ 用户在浏览器登录授权服务器 → 授权服务器返回 authorization_code

6️⃣ Client 用 authorization_code 换 access_token

7️⃣ Client 每次请求带 access_token → Server 验证 Token + Scopes

PRM 文档示例:

json
{
  "resource": "https://your-server.com/mcp",
  "authorization_servers": ["https://auth.your-server.com"],
  "scopes_supported": ["mcp:tools", "mcp:resources"]
}

WWW-Authenticate Header 示例:

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="mcp",
  resource_metadata="https://your-server.com/.well-known/oauth-protected-resource"

OAuth 2.1 为什么重要:

OAuth 2.0(有漏洞):
- 隐式授权(implicit grant)不安全,Token 直接泄露
- 不强制 PKCE,授权码拦截攻击可行


OAuth 2.1(修复版):
- 废除 implicit grant
- 强制 PKCE(Proof Key for Code Exchange)
- 强制使用 Token 绑定(DPoP 可选但推荐)

DPoP Token 绑定原理:

python
# 客户端生成 DPoP 证明(JWT)
dpop_proof = {
    "htm": "POST",           # HTTP 方法
    "htu": "/mcp/tools/call", # 请求目标
    "iat": 1713600000,       # 发行时间
    "jti": "unique-123"     # 防重放
}
# 用客户端私钥签名
signature = sign(dpop_proof, client_private_key)

# 每次请求带上
headers = {
    "Authorization": "Bearer <access_token>",
    "DPoP": <dpop_proof_jwt>
}

# Server 验证:Token + DPoP proof 匹配才能用
# 即使 Token 被截获,没有私钥也无法伪造 DPoP proof

企业 MCP 授权架构:

用户浏览器 → MCP Client → MCP Server

            Keycloak(企业 IdP)
            - 用户登录(SSO)
            - Token 颁发
            - 权限控制

企业场景:
- 员工离职 → IdP 禁用账户 → 所有 Token 立即失效 ✅
- 静态 API Key → 手动删除 ❌
- DPoP 绑定 → Token 被截也无法用 ✅

面试话术:

"MCP 的授权流程是 OAuth 2.1 + PRM + DPoP 三层。PRM 解决'Server 告诉 Client 授权服务器在哪'的问题;OAuth 2.1 是标准授权协议(强制 PKCE,修复了 2.0 的安全漏洞);DPoP 是可选但推荐的 Token 绑定,把 Token 绑定到客户端私钥,即使 Token 被截获也無法滥用。企业 MCP 部署推荐用 Keycloak 等 IdP 做授权,员工离职后 Token 自动失效,比静态 API Key 安全得多。"

📚 参考:MCP 官方规范:Authorization(OAuth 2.1 + DPoP)

⭐ 面试加分项:

  • 了解 RFC 9728(PRM)、RFC 9449(DPoP)、OAuth 2.1 的核心区别
  • 能画出完整 MCP 授权流程的时序图
  • 理解 Dynamic Client Registration(DCR)和预注册的适用场景