安全MCP服务器

使用Spring Authorization Server和GitHub OAuth2保护MCP服务器,用户通过GitHub认证获取JWT令牌来调用受保护的MCP工具。

  • by danvega
  • Java
  • 本地部署
  • 16 星标
  • 更新于
在 GitHub 查看 danvega/mcps

使用说明

使用Spring AI保护的MCP服务器

演示如何使用Spring Authorization Server和GitHub OAuth2来保护模型上下文协议(MCP)服务器。用户通过GitHub进行身份验证,获取一个JWT令牌,并使用该令牌来调用受保护的MCP工具。

基于丹尼尔·加尼尔-莫鲁的文章: https://spring.io/blog/2025/09/30/spring-ai-mcp-server-security 的中文翻译为:https://spring.io/博客/2025年09月30日/2025/09/30/(此处为示意,实际翻译中网址保持不变)Spring AI MCP服务器安全

建筑

┌─────────────┐
│   GitHub    │ (Identity Provider)
└──────┬──────┘
       │
       ▼
┌────────────────────────┐
│  Authorization Server  │ (Port 9000)
│  - GitHub OAuth Login  │
│  - Issues JWT tokens   │
└──────┬─────────────────┘
       │
       ▼
┌─────────────┐  Authorization: Bearer <JWT>   ┌──────────────┐
│ MCP Client  │──────────────────────────────► │  MCP Server  │ (Port 8080)
└─────────────┘                                │  - 2 Tools   │
                                               └──────────────┘

项目结构

mcps/
├── pom.xml                                   # Parent POM
├── mvnw                                      # Maven wrapper
│
├── authorization-server/                     # Port 9000
│   └── src/main/java/dev/danvega/authserver/
│       ├── AuthServerApplication.java        # Main application
│       ├── SecurityConfig.java               # OAuth2 + GitHub login
│       └── application.yml                   # Configuration
│
└── mcp-server/                               # Port 8080
    └── src/main/java/dev/danvega/mcps/
        ├── Application.java                  # Main application
        ├── McpServerSecurityConfig.java      # JWT validation
        └── McpToolsService.java              # MCP tools (echo, getCurrentUser)

快速入门

1. 先决条件

  • Java 21及以上版本
  • Maven 3.6及以上版本
  • GitHub账户

2. 创建一个GitHub OAuth应用程序

  1. 首选 GitHub 开发者设置
  2. 创建一个 新的OAuth应用程序:
    • 应用程序名称MCP 授权服务器
    • 主页URL: http://localhost:9000
    • 回调URL: http://localhost:9000/login/oauth2/code/github
  3. 保存 客户端ID 并且 客户端密钥

3. 设置环境变量

export GITHUB_CLIENT_ID="your-github-client-id"
export GITHUB_CLIENT_SECRET="your-github-client-secret"

4. 构建并运行

# Build both modules
./mvnw clean install

# Terminal 1: Start Authorization Server (must start first!)
./mvnw spring-boot:run -pl authorization-server

# Terminal 2: Start MCP Server
./mvnw spring-boot:run -pl mcp-server

授权服务器运行在9000端口,MCP服务器运行在8080端口。

使用MCP Inspector进行测试

MCP Inspector 工具提供了一种便捷的方式来测试完整的 OAuth2 流程,并与您的安全 MCP 服务器进行交互。

可用的MCP工具

1. 回声 - 回复一条带有时间戳的消息

{"message": "Hello"}

2. 获取当前用户(getCurrentUser) - 获取已认证的用户信息

{}

关键特性

授权服务器(端口 9000)

  • GitHub OAuth2 联合登录
  • 签发JWT访问令牌(有效期15分钟)
  • 刷新令牌(有效期1天)
  • 标准OAuth2/OIDC端点

MCP 服务器(端口 8080)

  • 使用认证服务器提供的JWKS验证JWT
  • 观众身份验证
  • 两个安全的MCP工具
  • 无状态架构

有用的端点

# Authorization server metadata
curl http://localhost:9000/.well-known/oauth-authorization-server

# JWKS (public keys for JWT validation)
curl http://localhost:9000/oauth2/jwks

配置详情

MCP客户端已预先注册,使用以下凭据:

  • 客户端ID: mcp-server
  • 客户端密钥: secret
  • 范围: openid, profile, email, mcp.server, mcp.tools

令牌有效期的配置在 authorization-server/src/main/resources/application.yml:

  • 访问令牌:15分钟
  • 刷新令牌:1天
  • 授权代码:5分钟

故障排除

401 未授权?

  • 首先确保认证服务器正在运行(端口9000)
  • 检查您的令牌是否已过期(有效期为15分钟)
  • 如需获取,请获取一个新令牌

GitHub OAuth 功能无法正常工作?

  • 验证回调URL: http://localhost:9000/login/oauth2/code/github
  • 检查 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET (被)设定为

参考文献