使用 WorkOS OAuth 保护 FastMCP 服务器:从零开始的端到端接入指南 使用 WorkOS OAuth 保护 FastMCP 服务器从零开始的端到端接入指南【免费下载链接】fastmcp The fast, Pythonic way to build MCP servers and clients.项目地址: https://gitcode.com/GitHub_Trending/fa/fastmcp导读本文以 FastMCP 仓库中的 workos_oauth 示例 为主线讲解如何用 WorkOS ConnectAuthKit为 FastMCP HTTP 服务器接入 OAuth2 身份认证。你将掌握在 WorkOS 后台创建应用并配置回调地址、通过WorkOSProvider一行式挂载认证、使用Client(..., authoauth)触发浏览器授权完成工具调用以及面向生产环境的 token 持久化与审计配置。读完即可复现服务器受保护、客户端需授权的完整链路。示例概览与工作原理examples/auth/workos_oauth/目录下有三个文件构成了一个最小可运行的端到端示例文件作用server.py用WorkOSProvider保护一个带echo工具的 FastMCP 服务器client.py用Client以 OAuth 方式连接受保护服务器README.md环境变量配置与三步运行指南从源码结构看WorkOSProvider继承自OAuthProxy见 workos.py采用OAuth ProxyOAuth 代理模式FastMCP 服务器自己不维护用户体系而是把授权码流程透明地转发给 WorkOS AuthKit 完成。整体链路为MCP 客户端请求服务器的.well-known/oauth-protected-resource等元数据端点发现授权服务器客户端重定向到 WorkOS AuthKit 的/oauth2/authorize完成用户登录与授权WorkOS 通过/oauth2/token换发 access token 并回调 FastMCP之后每次工具调用携带 tokenFastMCP 通过WorkOSTokenVerifier调用 AuthKit 的/oauth2/userinfo端点校验 token 有效性并提取用户信息。第一步准备 WorkOS 应用与环境变量在 WorkOS 后台创建 OAuth 应用参考 docs/integrations/workos.mdx 中的前置说明你需要登录 WorkOS进入Applications页面点击Create Application选择OAuth Application并命名复制Client ID通常以client_开头生成并妥善保存Client Secret记录AuthKit Domain形如https://your-app.authkit.app在Redirect URIs中精确添加回调地址开发环境为http://localhost:8000/auth/callback示例服务器运行在 8000 端口。回调地址必须与redirect_path完全一致。示例代码默认使用/auth/callback如需变更需同步修改WorkOSProvider(redirect_path...)参数与 WorkOS 后台配置。设置环境变量按示例 README.md 的步骤导出三项凭据export WORKOS_CLIENT_IDyour-client-id export WORKOS_CLIENT_SECRETyour-client-secret export WORKOS_AUTHKIT_DOMAINhttps://your-app.authkit.app服务端代码在 server.py 中通过os.getenv读取这三项环境变量。需要特别说明的是WORKOS_AUTHKIT_DOMAIN支持省略https://前缀——WorkOSProvider构造时会自动补齐见 workos.pyhttp://前缀也会原样保留tests/server/auth/providers/test_workos.py的test_authkit_domain_https_prefix_handling覆盖了三种写法示例对取不到的环境变量给出了空字符串/占位值兜底生产环境请务必使用真实值避免静默降级。第二步服务端配置详解最小服务端代码# server.py见 examples/auth/workos_oauth/server.py import os from fastmcp import FastMCP from fastmcp.server.auth.providers.workos import WorkOSProvider auth WorkOSProvider( client_idos.getenv(WORKOS_CLIENT_ID) or , client_secretos.getenv(WORKOS_CLIENT_SECRET) or , authkit_domainos.getenv(WORKOS_AUTHKIT_DOMAIN) or https://your-app.authkit.app, base_urlhttp://127.0.0.1:8000, # redirect_path/auth/callback, # 默认路径使用不同回调地址时再放开 ) mcp FastMCP(WorkOS OAuth Example Server, authauth) mcp.tool def echo(message: str) - str: Echo the provided message. return message if __name__ __main__: mcp.run(transporthttp, port8000)base_url必须是 MCP 端点实际可达的公开地址开发环境可为http://127.0.0.1:8000OAuth 元数据与回调都基于它生成。WorkOSProvider 核心参数结合 workos.py 的构造签名与 docs/integrations/workos.mdx 的参数说明常用参数如下参数必填默认值说明client_id是—WorkOS OAuth 应用 Client IDclient_secret是—WorkOS OAuth 应用 Client Secretauthkit_domain是—AuthKit 域名如https://your-app.authkit.appbase_url是—服务器的公开 URL含挂载路径required_scopes否[]校验 token 时强制要求的作用域如[openid, profile, email]valid_scopes否同required_scopes允许客户端请求的全部作用域通过 well-known 端点广播redirect_path否/auth/callbackOAuth 回调路径timeout_seconds否10调用 WorkOS API 的超时时间issuer_url否base_urlOAuth 元数据 issuer挂载在子路径下时建议设为根级 URL 避免发现过程 404require_authorization_consent否True是否要求用户授权前先看到同意页external表示由外部强制等效保护extra_authorize_params否None追加转发到授权端点的参数如{scope: openid profile email offline_access}强制下发 refresh token关于作用域有两点值得留意required_scopes不做默认假设示例与测试如 test_workos.py 的test_init_defaults均验证了这一点你需要显式声明至少openid才能获取用户身份信息若希望客户端能申请超出最低要求的额外作用域用valid_scopes显式声明OAuthProxy会通过 DCR 元数据广播test_valid_scopes_passed_through覆盖了该行为。Token 校验的内部机制WorkOSProvider内部装配了一个WorkOSTokenVerifier见 workos.py。由于 WorkOS AuthKit 签发的 access token 是不透明opaque字符串无法本地验签验证器采用userinfo 端点校验策略携带Authorization: Bearer token请求{authkit_domain}/oauth2/userinfo返回非 200 即判定无效校验返回的scope是否覆盖required_scopes缺失则拒绝见test_verify_token_rejects_missing_required_scopes通过后构造AccessToken把sub、email、name等用户声明写入claims供下游授权与审计使用。该逻辑同时决定了timeout_seconds与可选http_client连接池复用参数的意义每次工具调用都会触发一次 userinfo 网络往返超时配置直接影响认证请求的稳定性。第三步客户端连接与浏览器授权最小客户端代码# client.py见 examples/auth/workos_oauth/client.py import asyncio from fastmcp.client import Client SERVER_URL http://127.0.0.1:8000/mcp async def main(): try: async with Client(SERVER_URL, authoauth) as client: assert await client.ping() print(✅ Successfully authenticated!) tools await client.list_tools() print(f Available tools ({len(tools)}):) for tool in tools: print(f - {tool.name}: {tool.description}) except Exception as e: print(f❌ Authentication failed: {e}) raise if __name__ __main__: asyncio.run(main())关键点在于authoauthFastMCP 客户端据此实例化浏览器式 OAuth 流程对应 oauth.py 中的OAuth客户端提供者。首次运行时客户端发现服务器的授权元数据自动执行**动态客户端注册DCR**或使用预注册凭据打开本地回调端口并拉起系统浏览器跳转到 WorkOS 登录/授权页用户授权后浏览器重定向回本地http://localhost:port/callback客户端用授权码换取 tokentoken 默认缓存在内存MemoryStore中之后连接同一服务器直接复用。进阶静态客户端与 token 持久化对于需要固定 client_id 或跨进程持久化的场景OAuth客户端支持更细粒度的构造oauth.pyclient_id/client_secret传入后跳过 DCR使用静态凭据未传 secret 时token_endpoint_auth_method自动取none公开客户端传入 secret 则默认client_secret_posttoken_storage提供AsyncKeyValue后端可把 token 与 client 信息落盘默认 1 年 TTL避免每次重启重新授权使用内存存储时会收到显式告警提示additional_client_metadata追加注册元数据字段例如 AuthKit 场景下强制公开客户端from fastmcp.client.auth import OAuth auth OAuth(additional_client_metadata{token_endpoint_auth_method: none})AuthKit 默认按client_secret_basic做 token 交换与部分 MCP 客户端不兼容该写法可规避见 docs/integrations/authkit.mdx。第四步端到端运行按示例 README 的三步操作# 终端 1启动受保护服务器 python server.py# 终端 2启动客户端浏览器将打开 WorkOS 认证页 python client.py预期结果客户端完成授权后打印✅ Successfully authenticated!并列出服务器暴露的 1 个工具echo未认证的请求则会被服务器拒绝服务端由OAuthProxy拦截客户端侧以认证失败异常呈现。也可以不用示例文件直接使用 CLI 方式运行自己的服务器fastmcp run server.py --transport http --port 8000生产环境强化配置示例面向本地开发进入生产还需关注以下配置详见 docs/integrations/workos.mdx 的 Production Configuration 一节能力自 FastMCP 2.13.0 起token 与客户端注册持久化默认client_storage会在数据目录创建加密文件存储分布式部署建议改用 Redis 等共享后端并务必用FernetEncryptionWrapper包裹否则 OAuth token 将以明文落盘from key_value.aio.stores.redis import RedisStore from key_value.aio.wrappers.encryption import FernetEncryptionWrapper from cryptography.fernet import Fernet auth WorkOSProvider( ..., jwt_signing_keyos.environ[JWT_SIGNING_KEY], client_storageFernetEncryptionWrapper( key_valueRedisStore(hostos.environ[REDIS_HOST], portint(os.environ[REDIS_PORT])), fernetFernet(os.environ[STORAGE_ENCRYPTION_KEY]), ), )jwt_signing_key固定 FastMCP 自签 JWT 的密钥二者配合可让已注册客户端与已签发 token 在服务器重启后仍然有效短期 token 适配fastmcp_access_token_expiry_seconds可让 FastMCP 下发的 access token 生命周期与上游解耦适配无法优雅刷新短期 token 的 MCP 客户端token_expiry_threshold_seconds可提前判定过期规避竞态回调地址白名单allowed_client_redirect_uris限制 MCP 客户端可注册的回调 URI空列表表示禁止任何回调用户同意流程require_authorization_consent保持True仅本地开发/测试才建议关闭源码注释明确给出 SECURITY WARNING。替代方案AuthKit DCR推荐用于 DCR 场景若你的 WorkOS 项目启用了Dynamic Client Registration仓库还提供AuthKitProviderworkos.py——与WorkOSProvider的代理模式不同它采用Remote OAuth RFC 8707 资源指示符AuthKit 直接向客户端发行绑定服务器资源 URL 的 JWTaud声明FastMCP 作为资源服务器用 JWKS 本地验签不再逐次调用 userinfo。from fastmcp.server.auth.providers.workos import AuthKitProvider workos_auth AuthKitProvider( authkit_domainhttps://your-project-12345.authkit.app, base_urlhttps://your-fastmcp-server.com, ) mcp FastMCP(My App, authworkos_auth)使用前提与自动行为在 WorkOS 后台Connect → Configuration开启 DCR并把服务器资源 URL如http://127.0.0.1:8000/mcp加入MCP resource indicators列表否则 AuthKit 回落到环境级 audience 会导致校验失败401JWTVerifier.audience会在 MCP 挂载路径确定时set_mcp_path通常发生在http_app()构造阶段自动绑定到资源 URL见 workos.py测试 test_workos.py 的TestAuthKitAudienceBinding完整覆盖了 audience 绑定、resource_base_url分流与自定义 verifier 不被覆盖四种情况该 provider 还会转发 AuthKit 的/.well-known/oauth-authorization-server元数据供客户端发现。如何验证你的接入仓库为 WorkOS 认证提供了完整的自动化测试tests/server/auth/providers/test_workos.py可作为接入行为是否正确的对照清单test_init_with_explicit_params/test_init_defaults构造参数与默认值如redirect_path/auth/callback是否正确test_oauth_endpoints_configured_correctly授权端点应为{authkit_domain}/oauth2/authorize、token 端点为{authkit_domain}/oauth2/tokentest_extra_authorize_params_passed_throughextra_authorize_params是否透传到上游授权 URLTestWorkOSTokenVerifierScopesuserinfo 校验对缺失作用域的拒绝、对实际作用域的透传TestAuthKitProvider.test_unauthorized_access无凭证访问受保护服务器必须被拒绝。手动验证时可按以下顺序自查环境变量是否导出 → WorkOS 后台回调地址与redirect_path是否一致 → 服务器日志中元数据端点是否正常暴露 → 客户端首次授权是否拉起浏览器 → 二次运行是否命中 token 缓存。小结WorkOS OAuth 接入 FastMCP 的核心心法是代理或远程二选一需要兼容任意 MCP 客户端、希望 FastMCP 兜底 token 流程时选WorkOSProviderOAuth Proxy示例默认路线项目已启用 DCR、追求本地验签时选AuthKitProviderRemote OAuth RFC 8707。无论哪种examples/auth/workos_oauth/都是最快的起跑点——改三个环境变量、跑两个文件一个受保护的工具服务器即刻可验证。【免费下载链接】fastmcp The fast, Pythonic way to build MCP servers and clients.项目地址: https://gitcode.com/GitHub_Trending/fa/fastmcp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考