MCP Python SDK · 第 11 章 认证与授权:OAuth 2.1 全链路 章节摘要:把一个流式 HTTP 服务端暴露到公网,第一个绕不开的问题就是「谁能调」。本章讲透 MCP 的认证授权全链路,核心是一套基于 OAuth 2.1 的双向实现。服务端一侧,SDK 提供了一个完整的授权服务器(Authorization Server)——你只需实现一个「客户端与令牌」的存储接口,SDK 替你处理授权码流、令牌签发、校验、吊销这些标准 OAuth 流程;客户端一侧,SDK 提供了 (OAuth 客户端提供者)抽象,让 在连接受保护服务时自动走令牌获取与刷新。两端协同,构成「服务端保护资源、客户端持令牌访问」的完整闭环。
章节摘要:把一个流式 HTTP 服务端暴露到公网,第一个绕不开的问题就是「谁能调」。本章讲透 MCP 的认证授权全链路,核心是一套基于 OAuth 2.1 的双向实现。服务端一侧,SDK 提供了一个完整的授权服务器(Authorization Server)——你只需实现一个「客户端与令牌」的存储接口,SDK 替你处理授权码流、令牌签发、校验、吊销这些标准 OAuth 流程;客户端一侧,SDK 提供了
OAuthClientProvider(OAuth 客户端提供者)抽象,让Client在连接受保护服务时自动走令牌获取与刷新。两端协同,构成「服务端保护资源、客户端持令牌访问」的完整闭环。我们还会覆盖两个扩展——客户端凭证(机器到机器,无用户参与)与身份断言(把外部身份带进 MCP)。读完本章,你能为你的 MCP 服务加上完整的 OAuth 保护,并让客户端接通。
阅读完本章,你应当能够:
OAuthClientProvider——让 Client 在连接受保护服务时自动获取与刷新令牌,处理浏览器跳转与本地回调。整章逻辑可浓缩为一句话:MCP 的认证授权是一套 OAuth 2.1 的双向实现——服务端既当授权服务器(签发令牌)又当资源服务器(校验令牌),客户端用 OAuthClientProvider 自动获取与刷新令牌,两端协同构成「持令牌访问」的完整闭环,你只需实现存储与跳转两件事。
先理清理论。讲清 OAuth 2.1 的四个角色,以及 MCP 服务端的特殊之处——它同时承担授权服务器(签发令牌)与资源服务器(校验令牌、保护资源)两个职责。用一张图说明「一个 MCP 服务端内含两套 OAuth 逻辑」的架构。
讲清 SDK 提供的授权服务器骨架:你实现「客户端注册存储」「令牌存储」「授权码存储」这几个接口,SDK 替你处理授权码流(authorize)、令牌签发(token)、客户端注册(register)、令牌吊销(revoke)、元数据(metadata)这些标准端点。Bearer 令牌中间件(bearer_auth)自动校验每个进来的请求。
客户端一侧。讲清 OAuthClientProvider 如何让 Client 在连接受保护服务时自动走令牌获取——浏览器跳转授权页、用户同意、本地回调收令牌、后续请求带令牌、过期自动刷新。说明你需要实现的几个回调(发现元数据、跳转、收回调、存取令牌)。
并非所有调用都有用户参与——服务间调用、定时任务、后台编排,都是「机器到机器」。客户端凭证扩展(Client Credentials)让一个客户端用自己的凭证直接换令牌,无需用户授权。讲清它的适用场景与实现方式。
你已经有一个 SSO、一个公司身份系统、一个第三方登录,不想让用户在 MCP 里再登录一次。身份断言扩展(Identity Assertion)让你把一个已有的外部身份「断言」进 MCP,换得一个 MCP 令牌。讲清它如何避免重复登录,以及它与服务端信任配置的关系。
本章遵循「理论 → 服务端 → 客户端 → 无人参与 → 外部身份」的递进,先建模型再分别实现两端,最后扩展两种特殊场景:
OAuth 角色 (01) ── MCP 服务端的双重承担 │ ▼ 服务端 (02) ── 授权服务器 + Bearer 中间件 │ ▼ 客户端 (03) ── OAuthClientProvider 全流程 │ ▼ 客户端凭证 (04) ── 机器到机器 │ ▼ 身份断言 (05) ── 把外部身份带进来 │ ▼ 第 12 章:最后一章——装饰器糖之下,如何扩展 SDK 本身
理清角色是前提,服务端与客户端是必须成对理解的两半(只看一侧会困惑),客户端凭证与身份断言覆盖两种常见但容易被忽略的特殊场景。本章与第 8 章(传输安全)共同构成「把 MCP 服务公开到公网」的全部安全考量——第 8 章是网络层防护,本章是应用层认证。
前置知识:
本章为后续章节奠定的基础: