MCP for Beginners TypeScript 实战:基于 JWT 与作用域校验的 MCP 服务器认证实现

发布时间:2026/10/4 9:10:17
MCP for Beginners TypeScript 实战:基于 JWT 与作用域校验的 MCP 服务器认证实现 教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载导读本篇文章围绕mcp-for-beginners课程中「11-simple-auth」章节的 TypeScript 解决方案展开讲解如何为基于 Express 的 MCPModel Context ProtocolHTTP 服务器加上中间件认证从验证Authorization请求头、校验 JWT 令牌到按User.Read等作用域scope做细粒度授权。读完本文你将能独立跑通整个示例理解服务端中间件的完整校验链路并掌握通过修改作用域来观察认证失败现象的调试方法。认证与授权先厘清两个概念在进入代码之前先明确两个容易混淆的概念见 章节主文档Authentication认证判断来访者是否有权进入系统即是否能够访问承载 MCP Server 能力的资源服务器Authorization授权判断该用户是否有权访问其所请求的具体资源例如只能读取订单而不能删除。最朴素的实现是 Basic Auth客户端在Authorization请求头中携带凭据用户名密码的 Base64 或 API Key服务端通过**中间件middleware**在请求到达业务代码前校验凭据。校验失败时服务端返回401 Unauthorized未认证或403 Forbidden无权限。[!NOTE] 本文 TypeScript 示例基于 MCP2025-11-25规范使用mcp-session-id追踪会话MCP2026-07-28规范已移除initialize握手与协议级会话 ID。差异说明可参考 Whats Changed in MCP: The 2026-07-28 Specification。示例工程全景本示例位于 solution/typescript 目录结构如下solution/typescript/ ├── package.json # 脚本与依赖定义 ├── tsconfig.json └── src/ ├── server.ts # Express MCP Server含认证中间件 ├── client.ts # MCP 客户端携带令牌访问 /mcp ├── util.ts # JWT 生成createToken与校验verifyToken └── test.ts # 读取 .env 中令牌并验证的工具脚本从 package.json 可以看到全部操作都封装为 npm 脚本scripts: { start: node ./build/server.js, client: node ./build/client.js, generate: node ./build/util.js, build: tsc }依赖方面示例使用modelcontextprotocol/sdkStreamable HTTP 传输、expressWeb 框架、jsonwebtokenJWT 签发与校验、dotenv读取 .env 环境变量和zod工具入参 schema 定义。四步跑通示例第 1 步安装依赖npm install第 2 步构建npm run build该命令通过tsc将src/下的 TypeScript 编译到build/目录。第 3 步生成令牌npm run generate这条命令会执行 util.ts 中的createToken()构造一个使用HS256签名的 JWT其 payload 包含sub、name、admin、iat、exp1 小时后过期以及scopes: [Admin.Write, User.Read]然后将令牌写入当前目录的.env文件token...。客户端启动时会读取这个文件。第 4 步启动服务器与客户端先在第一个终端启动服务器npm start再在第二个终端启动客户端npm run client服务器终端应看到类似输出User exists User has required scopes Middleware executed客户端终端应看到类似输出Connected to MCP server with session ID: c1e50d7b-acff-4f11-8f96-5ae490ca1eaa Available tools: { tools: [ { name: process-files, inputSchema: [Object] } ] } Client disconnected. Exiting...客户端成功连接后通过listTools列出了服务端注册的process-files工具。服务端中间件的四道校验关卡核心认证逻辑集中在 server.ts 的app.use(...)中间件中它对所有进入/mcp的请求依次执行四道检查app.use((req, res, next) { // 1. Authorization 请求头是否存在 if(!req.headers[authorization]) { res.status(401).send(Unauthorized); return; } let token req.headers[authorization]; // 2. JWT 是否有效完整性/签名校验 if(!isValid(token)) { res.status(403).send(Forbidden); return; } // 3. 令牌对应的用户是否存在于系统中 if(!isExistingUser(token)) { res.status(403).send(Forbidden); console.log(User does not exist); return; } console.log(User exists); // 4. 令牌是否具备所需作用域 if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); return; } console.log(User has required scopes); console.log(Middleware executed); next(); });这四道检查对应了本文开头区分的认证与授权请求头存在性缺失则直接返回401 Unauthorized属于认证失败令牌有效性isValid内部调用verifyTokenjwt.verify校验签名与过期时间失败返回403 Forbidden用户存在性isExistingUser将令牌中的name与内存中的用户列表比对真实项目应查询数据库代码中留有// TODO, check if user exists in DB作用域校验hasScopes检查令牌中的scopes数组是否包含User.Read不满足返回403 Forbidden - insufficient scopes。其中hasScopes的实现server.ts使用了every语义——要求所有必需作用域都存在function hasScopes(scope: string, requiredScopes: string[]) { let decodedToken verifyToken(scope); return requiredScopes.every(scope decodedToken?.scopes.includes(scope)); }值得注意这些检查只是作者强调的最低限度校验集合章节文档原话these are the absolute minimum of checks you should be doing。生产环境还应叠加来源 IP、请求频率防机器人、令牌吊销检查等。客户端如何携带令牌客户端 client.ts 通过dotenv读取.env中的令牌并将其放入传输层requestInit.headersconfig(); let sessionId: string | undefined undefined; let options: StreamableHTTPClientTransportOptions { sessionId: sessionId, requestInit: { headers: { Authorization: process.env.token || secret123 } } }; const serverUrl http://localhost:8000/mcp;随后把options传给StreamableHTTPClientTransport连接成功后记录transport.sessionId并调用client.listTools()。这正是章节文档所说的「两步走」先构造携带凭据的配置对象再将其传给传输层。配套的 test.ts 可以在不启动服务器的情况下独立验证.env中的令牌读取令牌、verifyToken解码、再检查用户是否存在方便排查令牌生成环节的问题。动手实验修改作用域观察认证失败为了验证作用域校验真的生效按章节文档做如下实验。找到 server.ts 中的代码if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); }把User.Read改成User.Write然后重新构建并重启服务器npm run build npm start由于当前.env中令牌的scopes只有User.Read和Admin.Write没有User.Write认证会失败。此时客户端终端输出Error initializing client: Error: Error POSTing to endpoint (HTTP 403): Forbidden - insufficient scopes服务器终端则停留在User exists说明请求通过了「用户存在性」检查但在「作用域校验」环节被拦截没有继续往下执行。恢复方式有两种改回服务端代码把User.Write改回User.Read重新npm run build给令牌补上该作用域修改 util.ts 中 payload 的scopes数组例如加入User.Write执行npm run generate重新生成.env再重跑客户端。这个实验直观展示了 MCP 场景下「认证通过、授权失败」的分层现象也是排查403类错误的标准思路先确认令牌是否过期/无效再确认作用域是否满足服务端要求。从 Basic Auth 走向 JWT 与更安全的架构章节主文档 README 详细论述了从简单凭据升级到 JWT 的收益安全性Basic Auth 反复传输凭据JWT 有签发时间与过期时间天然支持基于角色/作用域的细粒度访问控制无状态与可扩展性JWT 自包含用户信息无需服务端会话存储可本地校验互操作与联邦JWT 是 OpenID Connect 的核心配合 Entra ID、Google Identity、Auth0 等身份提供商可支持单点登录模块化与灵活性可配合 Azure API Management、NGINX 等 API 网关使用性能与缓存解码后的 JWT 可缓存减少重复解析开销高级特性支持服务端 introspection有效性检查与 revocation令牌吊销。同时务必注意代码中的安全提醒不要将密钥硬编码在代码里util.ts 的注释明确写着Use env vars in production示例中的your-secret-key仅用于演示传输凭据至少需要 HTTPS还应规划短生命周期访问令牌 长生命周期刷新令牌的机制。课程后续还提供了两处进阶路径将身份模型迁移到标准 IdP如 Entra的 mcp-security-entra以及将 MCP 服务器接入宿主环境的 Setting Up MCP Hosts。总结通过本文你完整走通了mcp-for-beginners课程 11-simple-auth 章节的 TypeScript 样例理解了认证与授权的区别、看到了 Express 中间件如何对/mcp请求实施「请求头 → 令牌 → 用户 → 作用域」四层校验、掌握了npm run generate生成 JWT 令牌并注入.env的流程并通过修改User.Read为User.Write亲手验证了授权失败的行为。这套「中间件 JWT 作用域」的组合正是为后续接入 OAuth 2.1 与标准身份提供商打下的基础。赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐MCP for Beginners TypeScript 简单认证实战用 JWT 与 RBAC 中间件保护 Streamable HTTP 服务MCP for Beginners TypeScript 简单认证实战用 JWT 与 RBAC 中间件保护 Streamable HTTP 服务 导读 本文聚教程文档人工智能基于 MCP Inspector 验证 TypeScript 低层 MCP 服务器构建、工具调用与参数校验实战基于 MCP Inspector 验证 TypeScript 低层 MCP 服务器构建、工具调用与参数校验实战 本文围绕 mcp for beginners教程文档人工智能MCP 服务认证从入门到实战在 mcp-for-beginners 中用 Basic Auth、JWT 与 RBAC 保护你的 MCP ServerMCP 服务认证从入门到实战在 mcp for beginners 中用 Basic Auth、JWT 与 RBAC 保护你的 MCP Server 导读 M教程文档人工智能上一篇ATLauncher 开源项目使用教程下一篇为什么选择Rainbow深度解析7大强化学习技术的完美融合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考