使用说明
使用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应用程序
- 首选 GitHub 开发者设置
- 创建一个 新的OAuth应用程序:
- 应用程序名称MCP 授权服务器
- 主页URL:
http://localhost:9000 - 回调URL:
http://localhost:9000/login/oauth2/code/github
- 保存 客户端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(被)设定为