安全的FastMCP+Okta OAuth服务器
采用Okta OAuth/OIDC保护的生产风格FastMCP v3服务器。\ 它通过Okta JWKS验证JWT访问令牌,强制作用域,应用自定义授权检查,并公开用于数学、网络搜索和内容生成的工具。
建筑
MCP Client / Agent
|
| OAuth Login
v
Okta Authorization Server
|
| JWT Access Token
v
FastMCP Server
|
+-- Token Verification (JWKS)
+-- Scope Authorization
+-- Identity Extraction
|
v
Tools
- Tavily Search
- Addition
- Subtraction
- Content Generator (LangChain)项目结构
secure-mcp-okta/
|
|- main.py
|- config.py
|- requirements.txt
|- .env
|- README.md
|- auth/
| |- __init__.py
| |- okta_verifier.py
| |- auth_checks.py
|- tools/
| |- __init__.py
| |- math_tools.py
| |- search_tool.py
| |- content_tool.py
|- services/
| |- __init__.py
| |- langchain_service.py
|- examples/
|- client_example.py已实现的功能
- 使用JWKS进行Okta OAuth/OIDC JWT验证
- 基于范围的授权
- 敏感工具上已验证电子邮件的额外身份验证检查
- 通过以下方式提取身份
whoami工具 - Tavily网络搜索工具
- 加法和减法工具
- LangChain驱动的文章生成工具
先决条件
- Python 3.10+
- 带有授权服务器的Okta租户(通常
default) - API访问管理在Okta启用
- OpenAI API密钥
- Tavilly API密钥
OCT设置
- 在Okta中为您的MCP客户端创建OAuth 2.0应用程序集成。
- 在授权服务器中,设置匹配的受众
OKTA_AUDIENCE. - 添加您计划实施的范围,例如
api. - 确保已发放的访问令牌包含预期的声明(
email_verified,sub等等)。 - 确认发行人值如下:
https://your-company.okta.com/oauth2/default
- 创建或使用预先注册的客户端应用程序并注意
client_id(以及client_secret如果是机密客户)。 - 将重定向URI添加到Okta应用程序:
http://localhost:8765/callback
安装
python3 -m venv venv-okta-mcp
source venv-okta-mcp/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt配置
更新 .env:
OPENAI_API_KEY=xxxxx
TAVILY_API_KEY=xxxxx
OKTA_DOMAIN=https://your-company.okta.com
OKTA_ISSUER=https://your-company.okta.com/oauth2/default
OKTA_AUDIENCE=api
REQUIRED_SCOPES=api
MCP_BASE_URL=http://localhost:8000
REQUIRE_VERIFIED_EMAIL_FOR_ADD=false
OKTA_CLIENT_ID=your_okta_client_id
OKTA_CLIENT_SECRET=optional_client_secret
OAUTH_CALLBACK_PORT=8765REQUIRED_SCOPES 支持逗号分隔的值,例如:
REQUIRED_SCOPES=api,profile运行服务器
python main.py服务器终结点:
http://localhost:8000/mcp暴露的工具
add(a: int, b: int):需要配置作用域(可选)email_verified=true当REQUIRE_VERIFIED_EMAIL_FOR_ADD=true)subtract(a: int, b: int):需要配置作用域tavily_search(query: str):需要配置作用域generate_article(topic: str):需要配置作用域whoami():需要配置作用域并返回令牌标识数据
客户电话示例
使用 examples/client_example.py:
python examples/client_example.py客户端流:
- 从FastMCP中发现受保护的资源元数据。
- 解析Okta授权服务器元数据。
- 使用预先注册
OKTA_CLIENT_ID(无本地DCR回退)。 - 启动身份验证流并使用令牌调用MCP工具。
安全须知
- JWT签名验证使用Okta JWKS(
{issuer}/v1/keys). - 令牌验证包括颁发者、受众、过期和所需范围。
- 可选的自定义身份验证检查(
require_verified_email)启用时阻止未经验证的电子邮件。 - 身份可以通过令牌声明进行审核
whoami.
生产增强
- 添加结构化审计日志:用户、工具、请求ID、延迟。
- 添加速率限制(例如Redis+SlowAPI)。
- 添加可观察性(开放遥测+普罗米修斯)。
- 使用Okta组添加RBAC(
admin,developer,viewer). - 为多租户部署添加租户感知策略检查。
故障排除
OKTA_ISSUER is required:setOKTA_ISSUER在.env.OKTA_AUDIENCE is required:setOKTA_AUDIENCE在.env.MCP_BASE_URL is required:setMCP_BASE_URL到服务器公共URL(用于本地测试:http://localhost:8000).Set OKTA_CLIENT_ID in .env:为示例客户端添加预先注册的Okta OAuth客户端ID。TAVILY_API_KEY is required:setTAVILY_API_KEY在.env.- 授权错误:确保令牌具有所需的范围
REQUIRED_SCOPES. Email must be verified:setREQUIRE_VERIFIED_EMAIL_FOR_ADD=true只有在您的访问令牌包含以下内容后email_verified=true.externally-managed-environment使用pip:你的shell可以别名pip到Homebrew pip。使用python -m pip ...激活venv后,或运行unalias pip.
