Skip to main content
Glama
jwt_auth_architecture.md8.19 kB
# FastMCP JWT 认证 - 架构设计文档 ## 1. 系统架构概述 FastMCP JWT认证机制基于OAuth 2.0 Bearer Token规范实现,通过扩展现有的FastMCPService认证逻辑,增加JWT解析与验证能力,同时保持对现有API密钥认证的兼容支持。 ### 1.1 架构图 ``` ┌──────────────┐ ┌─────────────────┐ ┌───────────────────┐ │ │ │ │ │ │ │ 客户端应用 ├──────▶ MCP HTTP 服务 ├──────▶ 认证提供者工厂 │ │ │ │ │ │ │ └──────────────┘ └─────────────────┘ └─────────┬─────────┘ │ ▼ ┌─────────────────────────────────────────────────────┐ │ │ │ 认证提供者 │ │ │ └───────────┬─────────────────────────────┬───────────┘ │ │ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ │ │ API密钥认证提供者 │ │ JWT认证提供者 │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ ``` ## 2. 核心组件设计 ### 2.1 认证提供者工厂 **实现位置**: `_create_auth_provider` 方法 负责根据服务器配置创建适当类型的认证提供者实例。根据`auth_method`配置创建以下两种认证提供者之一: 1. **API密钥认证提供者**:简单字符串比对的认证逻辑 2. **JWT认证提供者**:实现完整的JWT解析与验证逻辑 ```python def _create_auth_provider(self, server_security_settings): """ 根据安全设置创建合适的认证提供者 """ auth_method = server_security_settings.get('auth_method', 'api_key') if auth_method == 'jwt': # JWT认证逻辑 return BearerAuthProvider(...) else: # API密钥认证逻辑 return ApiKeyAuthProvider(...) ``` ### 2.2 认证检查流程 **实现位置**: `_check_authentication` 异步方法 处理HTTP请求的认证逻辑,执行以下流程: 1. 从HTTP请求中提取Authorization头 2. 解析Bearer token 3. 根据认证提供者类型执行相应验证 4. 验证通过后返回用户信息并设置到上下文 ```python async def _check_authentication(self, mcp_server, ctx): """ 检查并验证请求的认证信息 """ # 1. 检查是否需要认证 if not mcp_server._security_settings.get('require_auth'): return None # 2. 获取请求和令牌 request = ctx.get_http_request() token = self._extract_token(request) # 3. 根据认证类型执行验证 auth_method = mcp_server._security_settings.get('auth_method', 'api_key') if auth_method == 'jwt': # JWT验证流程 user_info = await mcp_server._auth_provider.verify_token(token) ... else: # API密钥验证流程 if token != mcp_server._security_settings.get('api_key'): return {"status": "error", "message": "Invalid API key"} ... ``` ### 2.3 JWT验证流程 JWT认证提供者使用FastMCP内置的`BearerAuthProvider`类,执行以下验证: 1. JWT结构与格式验证 2. 签名验证(使用RSA公钥或JWKS获取的密钥) 3. 过期时间检查 4. 发行者和受众验证 验证配置通过以下参数设置: - `public_key`: RSA公钥,PEM格式 - `jwks_uri`: JWKS端点URI(与public_key二选一) - `issuer`: 允许的JWT发行者 - `audience`: 允许的JWT受众 - `algorithm`: JWT签名算法(默认RS256) ## 3. 数据模型设计 ### 3.1 MCPServer模型扩展 在`mcp_server.py`中的`MCPServer`模型中添加以下字段: ```python auth_method = fields.Selection([ ('api_key', 'API密钥认证'), ('jwt', 'JWT令牌认证') ], string='认证方式', default='api_key', required=True) api_key = fields.Char(string='API密钥') jwt_public_key = fields.Text(string='JWT公钥') jwks_uri = fields.Char(string='JWKS URI') jwt_issuer = fields.Char(string='JWT发行者') jwt_audience = fields.Char(string='JWT受众') jwt_algorithm = fields.Char(string='JWT算法', default='RS256') ``` ### 3.2 安全设置数据流 在`_get_server_security_settings`方法中,收集安全配置并提供给认证组件: ```python def _get_server_security_settings(self, mcp_server_id): """获取MCP服务器的安全设置""" MCP_Server = self.env['mcp.server'] mcp_server = MCP_Server.browse(mcp_server_id) settings = { 'require_auth': mcp_server.require_auth, 'auth_method': mcp_server.auth_method, 'allowed_ips': mcp_server.allowed_ips.split('\n') if mcp_server.allowed_ips else [], 'log_requests': mcp_server.log_requests } # 根据认证方式添加相应配置 if settings['auth_method'] == 'api_key': settings['api_key'] = mcp_server.api_key elif settings['auth_method'] == 'jwt': if mcp_server.jwt_public_key: settings['jwt_public_key'] = mcp_server.jwt_public_key if mcp_server.jwks_uri: settings['jwks_uri'] = mcp_server.jwks_uri if mcp_server.jwt_issuer: settings['jwt_issuer'] = mcp_server.jwt_issuer if mcp_server.jwt_audience: settings['jwt_audience'] = mcp_server.jwt_audience if mcp_server.jwt_algorithm: settings['jwt_algorithm'] = mcp_server.jwt_algorithm return settings ``` ## 4. 接口设计 ### 4.1 HTTP认证接口 所有FastMCP HTTP请求通过以下方式提供认证信息: **请求头**: ``` Authorization: Bearer <token> ``` 其中`<token>`为: - API密钥认证:API密钥字符串 - JWT认证:完整的JWT令牌 ### 4.2 JWT令牌结构 标准JWT令牌包含三部分:Header、Payload和Signature **示例Header**: ```json { "alg": "RS256", "typ": "JWT" } ``` **示例Payload**: ```json { "sub": "1234567890", "name": "用户名称", "iss": "认证服务器标识符", "aud": "mcp-server", "iat": 1516239022, "exp": 1516242622 } ``` ## 5. 测试策略 ### 5.1 单元测试 针对认证功能的单元测试包括: 1. API密钥认证测试用例 - 有效API密钥测试 - 无效API密钥测试 - 缺少Authorization头测试 2. JWT认证测试用例 - 有效JWT令牌测试 - 过期JWT令牌测试 - 签名无效JWT令牌测试 - 发行者/受众不匹配测试 ### 5.2 集成测试 确保认证机制与FastMCP服务的其他组件集成正常: 1. API密钥到JWT迁移测试 2. IP白名单与JWT组合测试 3. 日志记录功能测试 ## 6. 安全考虑 1. **密钥管理** - JWT私钥安全存储 - 公钥适当保护 - 定期密钥轮换机制 2. **防护措施** - 令牌过期机制 - IP地址过滤 - 权限最小化原则 3. **日志与监控** - 认证失败记录 - 异常访问模式检测

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kaikongbj/odoo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server