AI 技术
#MCP#OAuth 2.0#刷新令牌#访问令牌#令牌轮换

MCP 远程服务器启用 OAuth 刷新令牌轮换后,旧令牌为何还能调用工具

不少人在 MCP 远程服务器启用 OAuth 刷新令牌轮换后,发现旧令牌似乎仍能调用工具。本文区分刷新令牌与访问令牌,解释轮换约束落在哪个环节、访问令牌为何在过期前仍会被资源服务器接受,以及排查时应检查的令牌校验点。

先区分两种令牌:旧刷新令牌不能直接调用工具,能调用工具的是访问令牌。RFC 6749 将刷新令牌定义为获取访问令牌的凭证;RFC 9700 要求公共客户端的刷新令牌使用发送方约束,或采用 Section 4.14 的刷新令牌轮换。轮换约束的是刷新环节。按 RFC 6749 的描述,访问令牌在过期前会被重复用于资源请求,过期或无效后资源服务器才返回 invalid token error。因此,轮换后工具仍可调用,通常不是旧刷新令牌在起作用,而是请求携带的旧访问令牌尚未过期,且资源服务器接受了它。

刷新令牌只走授权服务器

在 MCP 远程部署里,客户端、授权服务器、MCP 资源服务器分工不同:客户端先拿访问令牌,再用访问令牌调用工具;访问令牌过期或无效时,才用刷新令牌到授权服务器换新。RFC 6749 的刷新流程是授权服务器验证刷新令牌,签发新访问令牌,并可选签发新刷新令牌。

轮换要求落在这个换取动作上:公共客户端应让刷新令牌可轮换或受发送方约束。发送方约束是把刷新令牌与特定客户端绑定,轮换则是在刷新时换发新刷新令牌,降低旧刷新令牌被重放的价值。资料只支持到这里,没有给出轮换后旧刷新令牌在所有实现中立即失效的统一行为。

旧访问令牌为何还能通过

RFC 6749 描述客户端在访问令牌有效时重复用它请求资源,直到过期;知道过期后才跳到刷新步骤。资源服务器只在访问令牌无效时返回 invalid token error。轮换刷新令牌不会改变一个已经签发、尚未过期的访问令牌的过期时间;资料也没有把刷新令牌轮换与访问令牌撤销描述为同一个事件。

工程上通常有两种校验路径:资源服务器本地验证令牌,或每次向授权服务器查询状态。如果访问令牌是自包含的,资源服务器可能只验证签名和 exp;这种情况下,刷新端点发生轮换不会出现在它的判断里,旧访问令牌在过期前仍可能通过。若资源服务器每次都查询授权服务器状态,才可能更早发现撤销。

凭证发送给谁轮换后的影响
刷新令牌授权服务器轮换要求针对它;旧刷新令牌能否继续换新令牌取决于授权服务器实现
访问令牌MCP 资源服务器在过期前仍可能通过;是否提前失效取决于资源服务器校验方式

MCP 资源服务器该查什么

一篇介绍 MCP 与 OAuth 2.1 的博客转述,MCP 资源服务器在处理请求前必须验证访问令牌,并验证受众,确保令牌专门为该服务器颁发;同一文章还建议认证服务器对公共客户端轮换刷新令牌、颁发短期访问令牌。这些是二手转述,不是 MCP 官方原文。

落到排查上:先看工具请求的 Authorization 头里是不是访问令牌;再看资源服务器是否校验过期时间、签名(若为自包含令牌)和受众;最后看访问令牌寿命是否足够短,以及资源服务器是否具备撤销或状态查询能力。若只做本地验签和 exp 检查,刷新令牌轮换不会缩短旧访问令牌的可用窗口。

RFC 9700 的 Section 4.14 正文未在本次资料中展开,不能据此推断某个授权服务器在轮换后会不会立即拒绝旧刷新令牌;资料也没有提供任何 MCP 厂商的实现或日志。能确定的判断是:工具调用成功时,先检查未过期的访问令牌,不要把旧刷新令牌当成工具调用凭证。

资料来源

  1. RFC 6749: The OAuth 2.0 Authorization Framework
  2. RFC 9700: Best Current Practice for OAuth 2.0 Security
  3. OAuth 2.0 Security Best Current Practice (draft-ietf-oauth-security-topics)
  4. OAuth 2.1认证授权和MCP生态 - 蝈蝈俊 - 博客园