Azure AD认证服务

一个基于FastAPI的应用,演示了如何为REST API端点和MCP服务器实现Azure AD认证,支持OAuth2.1认证和数学运算功能。

  • by ajafry
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 ajafry/mcp-auth

使用说明

使用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租户

⚙️ 安装

  1. 克隆存储库:

    git clone <repository-url>
    cd ApiMcpAuth
    
  2. 使用uv安装依赖项:

    uv sync
    

    或者从requirements.txt安装:

    uv pip install -r requirements.txt
    

🔧 配置

  1. 创建一个 .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"}
    
  2. Azure AD应用程序设置:

    • 在Azure AD中注册应用程序
    • 为OAuth2流配置重定向URI
    • 设置API权限和作用域
    • 记下租户ID和客户端ID

🏃‍♂️ 运行应用程序

FastAPI REST API

  1. 导航到API目录:

    cd src/api
    
  2. 运行FastAPI服务器:

    uv run python main.py
    

    或者直接使用uvicorn:

    uv run uvicorn main:app --host 0.0.0.0 --port 8000 --reload
    
  3. 访问应用程序:

    • APIhttp://localhost:8000
    • Swagger用户界面:http://localhost:8000/docs
    • 重新记录:http://localhost:8000/redoc

MCP服务器

  1. 导航到MCP目录:

    cd src/mcp
    
  2. 运行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) -将两个数字相乘

🧪 测试

使用提供的测试文件:

  1. HTTP测试:使用 src/test.http 使用HTTP客户端
  2. MCP测试:运行MCP服务器测试:
    cd src/mcp
    uv run python test_server.py
    

🔐 认证流程

  1. OAuth2授权码流:用于web应用程序
  2. JWT令牌验证:针对Azure AD验证的承载令牌
  3. 基于角色的访问:不同的端点需要不同的角色
  4. 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范围 是

🚨 故障排除

常见问题

  1. 身份验证错误:

    • 验证Azure AD配置
    • 检查客户端ID和租户ID
    • 确保范围配置正确
  2. CORS问题:

    • 检查CORS中间件配置
    • 验证生产中允许的来源
  3. 令牌验证失败:

    • 确保令牌未过期
    • 验证受众声明是否与客户端ID匹配

日志记录

该应用程序使用结构化日志记录。检查日志以获取详细的错误信息:

  • API日志:运行FastAPI服务器时的控制台输出
  • MCP日志:运行MCP服务器时的控制台输出

🤝 贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 进行更改
  4. 如果适用,添加测试
  5. 提交拉取请求

📄 许可证

[在此处添加您的许可证信息]

🔗 依赖项

  • 快速API:用于构建API的现代快速web框架
  • fastapi azure身份验证:用于FastAPI的Azure AD身份验证
  • FastMCP:模型上下文协议服务器实现
  • python dotenv:环境变量管理
  • 铝合金迷你气缸:Microsoft身份验证库
  • PyJWT:JSON Web令牌实现