使用说明
使用Azure Entra Id进行MCP身份验证
一个基于FastAPI的应用程序,用于演示REST API端点和模型上下文协议(MCP)服务器的Azure AD身份验证。此项目展示了如何使用Azure Active Directory OAuth2.1身份验证保护API,并通过MCP服务器实现数学运算。
🏗️ 项目结构
ApiMcpAuth/
├── README.md
├── requirements.txt
├── src/
│ ├── test.http # HTTP test requests
│ ├── api/ # FastAPI REST API
│ │ ├── auth.py # Azure AD authentication setup
│ │ ├── main.py # FastAPI application entry point
│ │ └── README.md
│ └── mcp/ # Model Context Protocol server
│ ├── auth.py # MCP authentication logic
│ ├── run_server.py # MCP server runner
│ ├── server.py # MCP server implementation
│ ├── test_server.py # MCP server tests
│ └── README.md
🚀 特性
FastAPI REST API
- Azure AD 身份验证:使用Azure Active Directory OAuth2保护端点
- CORS支持:已启用跨源资源共享
- Swagger UI集成:带有OAuth2流的交互式API文档
- 数学运算:用于基本计算的简单端点
MCP服务器
- 远程MCP服务器:基于FastMCP的数学运算服务器
- 基于角色的授权:不同的访问级别(管理员、用户)
- JWT令牌验证:确保MCP工具的安全访问
- 数学工具:加法、减法和乘法运算
🛠️ 先决条件
- Python 3.8+
- 紫外线 包管理器
- Azure AD应用程序注册
- 有效的Azure AD租户
⚙️ 安装
-
克隆存储库:
git clone <repository-url> cd ApiMcpAuth -
使用uv安装依赖项:
uv sync或者从requirements.txt安装:
uv pip install -r requirements.txt
🔧 配置
-
创建一个
.env文件 在根目录中:# Copy the example environment file and customize it cp .env.example .env然后编辑
.env包含您的实际Azure AD值的文件:# Azure AD Configuration TENANT_ID=your-azure-tenant-id API_CLIENT_ID=your-api-application-client-id MCP_CLIENT_ID=your-mcp-client-id # Scopes SCOPE=api://your-app-id/User.CallApi API_SCOPES={"api://your-app-id/User.CallApi": "User.CallApi"} -
Azure AD应用程序设置:
- 在Azure AD中注册应用程序
- 为OAuth2流配置重定向URI
- 设置API权限和作用域
- 记下租户ID和客户端ID
🏃♂️ 运行应用程序
FastAPI REST API
-
导航到API目录:
cd src/api -
运行FastAPI服务器:
uv run python main.py或者直接使用uvicorn:
uv run uvicorn main:app --host 0.0.0.0 --port 8000 --reload -
访问应用程序:
- APIhttp://localhost:8000
- Swagger用户界面:http://localhost:8000/docs
- 重新记录:http://localhost:8000/redoc
MCP服务器
-
导航到MCP目录:
cd src/mcp -
运行MCP服务器:
uv run python run_server.py
📚 API终点
公共端点
GET /hello/{name}-简单问候端点(无需身份验证)
受保护的端点(需要Azure AD身份验证)
GET /add/{num1}/{num2}-加两个数字GET /mcp/-MCP集成端点
MCP工具
add(a, b)-添加两个数字(需要管理员角色)subtract(a, b)-减去两个数字multiply(a, b)-将两个数字相乘
🧪 测试
使用提供的测试文件:
- HTTP测试:使用
src/test.http使用HTTP客户端 - MCP测试:运行MCP服务器测试:
cd src/mcp uv run python test_server.py
🔐 认证流程
- OAuth2授权码流:用于web应用程序
- JWT令牌验证:针对Azure AD验证的承载令牌
- 基于角色的访问:不同的端点需要不同的角色
- PKCE支持:加强公共客户的安全
🛡️ 安全特性
- 令牌验证:使用Azure AD公钥验证的JWT令牌
- 基于角色的授权:细粒度访问控制
- CORS保护:可配置的跨来源政策
- 安全标头:包括标准安全标头
🔍 环境变量
| 变量 | 描述 | 必填 |
|---|---|---|
TENANT_ID |
Azure AD租户标识符 | 是 |
API_CLIENT_ID |
API应用程序客户端ID | 是 |
MCP_CLIENT_ID |
MCP客户端ID(可以与API_client_ID相同) | 是 |
API_SCOPES |
API作用域的JSON对象 | 是 |
SCOPE |
API访问的OAuth2范围 | 是 |
🚨 故障排除
常见问题
-
身份验证错误:
- 验证Azure AD配置
- 检查客户端ID和租户ID
- 确保范围配置正确
-
CORS问题:
- 检查CORS中间件配置
- 验证生产中允许的来源
-
令牌验证失败:
- 确保令牌未过期
- 验证受众声明是否与客户端ID匹配
日志记录
该应用程序使用结构化日志记录。检查日志以获取详细的错误信息:
- API日志:运行FastAPI服务器时的控制台输出
- MCP日志:运行MCP服务器时的控制台输出
🤝 贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 如果适用,添加测试
- 提交拉取请求
📄 许可证
[在此处添加您的许可证信息]
🔗 依赖项
- 快速API:用于构建API的现代快速web框架
- fastapi azure身份验证:用于FastAPI的Azure AD身份验证
- FastMCP:模型上下文协议服务器实现
- python dotenv:环境变量管理
- 铝合金迷你气缸:Microsoft身份验证库
- PyJWT:JSON Web令牌实现
