[ PROMPT_NODE_24732 ]
authorization
[ SKILL_DOCUMENTATION ]
# 授权
> 使用基于可调用对象的授权检查来控制对组件的访问,从而过滤可见性并强制执行权限。
授权控制经过身份验证的用户可以使用您的 FastMCP 服务器执行哪些操作。虽然身份验证验证身份(您是谁),但授权确定访问权限(您可以做什么)。FastMCP 提供了一个基于可调用对象的授权系统,该系统既可以在组件级别工作,也可以通过中间件全局工作。
授权模型围绕一个简单的概念:接收有关当前请求的上下文并返回 `True` 以允许访问或 `False` 以拒绝访问的可调用函数。多个检查通过 AND 逻辑组合,这意味着必须通过所有检查才能授予访问权限。
> **注意:** 授权依赖于仅在 HTTP 传输(SSE、可流式 HTTP)中可用的 OAuth 令牌。在 STDIO 模式下,没有 OAuth 机制,因此 `get_access_token()` 返回 `None`,并且所有授权检查都会被跳过。
> **注意:** 当配置了 `AuthProvider` 时,对 MCP 端点的所有请求都必须携带有效的令牌——未经身份验证的请求会在任何授权检查运行之前在传输层被拒绝。因此,授权检查区分的是基于其作用域 (Scopes) 和声明 (Claims) 的已验证用户,而不是已验证用户和未验证用户。
## 授权检查
授权检查是任何接受 `AuthContext` 并返回布尔值的可调用对象。授权检查可以是同步的,也可以是异步的,因此需要执行异步操作(如读取服务器状态或调用外部服务)的检查可以自然地工作。
python
from fastmcp.server.auth import AuthContext
def my_custom_check(ctx: AuthContext) -> bool:
# ctx.token 是 AccessToken | None
# ctx.component 是正在被访问的工具、资源或提示词
return ctx.token is not None and "special" in ctx.token.scopes
FastMCP 提供了两个涵盖常见授权模式的内置授权检查。
### require_scopes
基于作用域的授权检查,验证令牌是否包含所有指定的作用域。当提供多个作用域时,必须全部存在(AND 逻辑)。
python
from fastmcp import FastMCP
from fastmcp.server.auth import require_scopes
mcp = FastMCP("Scoped Server")
@mcp.tool(auth=require_scopes("admin"))
def admin_operation() -> str:
"""需要 'admin' 作用域。"""
return "管理员操作已完成"
@mcp.tool(auth=require_scopes("read", "write"))
def read_write_operation() -> str:
"""需要 'read' 和 'write' 作用域。"""
return "读写操作已完成"