Skip to main content
Glama
bearer-token-quickstart.md8.64 kB
# Bearer Token认证快速开始指南 ## 概述 本指南提供了在mcp-swagger-server中快速实现Bearer Token认证的最简方案。 ## 核心需求 - 为业务系统API调用自动添加 `Authorization: Bearer <token>` 头 - 支持多种Token配置方式 - 保持向后兼容性 - 预留扩展接口 ## 实现方案 ### 1. 最小化实现架构 ``` mcp-swagger-server ├── 认证配置解析 (Server层) ├── 认证配置传递 (传递给Parser) ├── Parser层增强 (核心修改点) │ ├── TransformerOptions扩展 │ ├── BearerAuthManager │ └── executeHttpRequest修改 └── CLI参数支持 ``` ### 2. 核心文件修改 #### 2.1 Parser层认证支持 **新增文件**: `packages/mcp-swagger-parser/src/auth/types.ts` ```typescript export interface AuthConfig { type: 'bearer' | 'none'; bearer?: { token: string; source: 'static' | 'env'; envName?: string; }; } export interface AuthManager { getAuthHeaders(): Promise<Record<string, string>>; getToken(): Promise<string>; } export class BearerAuthManager implements AuthManager { constructor(private config: AuthConfig) {} async getAuthHeaders(): Promise<Record<string, string>> { if (this.config.type !== 'bearer') return {}; const token = await this.getToken(); return { 'Authorization': `Bearer ${token}` }; } private async getToken(): Promise<string> { const { bearer } = this.config; if (!bearer) throw new Error('Bearer config required'); if (bearer.source === 'env') { const envToken = process.env[bearer.envName || 'API_TOKEN']; if (!envToken) throw new Error(`Environment variable ${bearer.envName} not found`); return envToken; } return bearer.token; } } ``` #### 2.2 扩展TransformerOptions **修改文件**: `packages/mcp-swagger-parser/src/transformer/types.ts` ```typescript import { AuthConfig } from '../auth/types'; export interface TransformerOptions { baseUrl?: string; includeDeprecated?: boolean; includeTags?: string[]; excludeTags?: string[]; requestTimeout?: number; defaultHeaders?: Record<string, string>; customHandlers?: Record<string, (args: any) => Promise<MCPToolResponse>>; pathPrefix?: string; stripBasePath?: boolean; includeFieldAnnotations?: boolean; annotationOptions?: AnnotationOptions; // 新增:认证配置 authConfig?: AuthConfig; } ``` #### 2.3 修改Transformer类 **修改文件**: `packages/mcp-swagger-parser/src/transformer/index.ts` ```typescript import { BearerAuthManager, AuthManager } from '../auth/types'; export class OpenAPIToMCPTransformer { private spec: OpenAPISpec; private options: Required<TransformerOptions>; private annotationExtractor: SchemaAnnotationExtractor; private authManager?: AuthManager; // 新增 constructor(spec: OpenAPISpec, options: TransformerOptions = {}) { this.spec = spec; this.options = { // ...existing options... authConfig: options.authConfig || { type: 'none' } }; this.annotationExtractor = new SchemaAnnotationExtractor(spec); // 初始化认证管理器 if (this.options.authConfig?.type === 'bearer') { this.authManager = new BearerAuthManager(this.options.authConfig); } } // 修改executeHttpRequest方法 private async executeHttpRequest( method: string, path: string, args: any, operation: OperationObject ): Promise<MCPToolResponse> { try { const { url, queryParams } = this.buildUrlWithParams(path, args, operation); // 准备请求头 const headers = { ...this.options.defaultHeaders }; // 新增:添加认证头 if (this.authManager) { const authHeaders = await this.authManager.getAuthHeaders(); Object.assign(headers, authHeaders); } const requestBody = this.buildRequestBody(args, operation); const response = await axios({ method: method.toLowerCase() as any, url, params: queryParams, data: requestBody, headers, // 包含认证头 timeout: this.options.requestTimeout, validateStatus: () => true, maxRedirects: 5, responseType: 'json' }); return this.formatHttpResponse(response, method, path, operation); } catch (error) { return this.handleRequestError(error, method, path); } } } ``` #### 2.4 Server层集成 **修改文件**: `packages/mcp-swagger-server/src/server/index.ts` ```typescript import { OpenAPIToMCPTransformer } from 'mcp-swagger-parser'; export class McpServer { constructor(private config: McpServerConfig) {} async start(): Promise<void> { const spec = await this.loadOpenApiSpec(); // 创建transformer时传递认证配置 const transformer = new OpenAPIToMCPTransformer(spec, { baseUrl: this.config.baseUrl, authConfig: this.config.auth, // 关键:传递认证配置 requestTimeout: this.config.timeout }); const tools = transformer.transformToMCPTools(); await this.startMcpServer(tools); } } ``` ## 使用方式 ### 1. 命令行使用 ```bash # 使用静态token mcp-swagger-server \ --openapi https://api.example.com/openapi.json \ --auth-type bearer \ --bearer-token "your-token-here" # 使用环境变量 export API_TOKEN="your-token-here" mcp-swagger-server \ --openapi https://api.example.com/openapi.json \ --auth-type bearer \ --bearer-env API_TOKEN ``` ### 2. 配置文件使用 ```json { "openapi": "https://api.example.com/openapi.json", "auth": { "type": "bearer", "bearer": { "source": "env", "envName": "API_TOKEN" } } } ``` ### 3. 编程式使用 ```typescript import { createServer } from 'mcp-swagger-server'; import { BearerAuth } from 'mcp-swagger-server/auth'; const auth = new BearerAuth({ type: 'bearer', bearer: { token: 'your-token', source: 'static' } }); const server = await createServer({ openapi: 'https://api.example.com/openapi.json', auth }); await server.start(); ``` ## 实施步骤 ### 第1天:Parser层认证基础 - [x] 创建认证类型定义 (`auth/types.ts`) - [x] 实现BearerAuthManager类 - [x] 扩展TransformerOptions接口 - [x] 添加基础测试 ### 第2天:Parser层HTTP请求增强 - [x] 修改OpenAPIToMCPTransformer构造函数 - [x] 修改executeHttpRequest方法添加认证头 - [ ] 测试HTTP请求包含Bearer Token - [ ] 验证认证流程 ### 第3天:Server层集成 - [ ] 修改McpServerConfig支持认证 - [ ] 更新McpServer类传递认证配置到Parser - [ ] 测试端到端认证流程 - [ ] 确保配置正确传递 ### 第4天:CLI和API集成 - [ ] 添加CLI参数支持认证配置 - [ ] 更新mcp-swagger-api支持认证 - [ ] 添加配置文件支持 - [ ] 测试不同配置方式 ### 第5天:测试和文档 - [ ] 完善测试覆盖 - [ ] 编写使用文档和示例 - [ ] 准备发布 - [ ] 端到端验证 ## 验证方式 ### 1. 单元测试 ```typescript describe('BearerAuth', () => { it('should add authorization header', async () => { const auth = new BearerAuth({ type: 'bearer', bearer: { token: 'test-token', source: 'static' } }); const headers = await auth.getHeaders(); expect(headers.Authorization).toBe('Bearer test-token'); }); }); ``` ### 2. 集成测试 ```bash # 启动测试服务器 mcp-swagger-server --openapi https://httpbin.org/spec.json --auth-type bearer --bearer-token test-token # 验证API调用包含认证头 curl -X GET http://localhost:3322/mcp/tools/get/headers ``` ### 3. 手工测试 - [ ] 使用httpbin.org测试认证头传递 - [ ] 测试不同Token配置方式 - [ ] 验证错误处理 ## 风险和注意事项 ### 安全风险 - 避免在日志中记录Token - 使用环境变量存储敏感信息 - 确保HTTPS传输 ### 兼容性风险 - 保持现有API不变 - 认证功能可选启用 - 向后兼容现有配置 ### 性能考虑 - 避免频繁Token获取 - 复用HTTP连接 - 合理的错误重试 ## 扩展计划 ### 短期扩展 - API Key认证 - Basic认证 - 自定义Header认证 ### 长期扩展 - OAuth2认证 - JWT Token刷新 - 多认证方式组合 ## 总结 这个方案提供了最小化的Bearer Token认证实现,具有以下特点: 1. **简单易用**: 核心功能只需4个文件修改 2. **配置灵活**: 支持静态Token和环境变量 3. **向后兼容**: 不影响现有功能 4. **易于扩展**: 为其他认证方式预留接口 该方案可以在5天内完成实施,满足基本的Bearer Token认证需求。

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/zaizaizhao/mcp-swagger-server'

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