Skip to content
🔗 分享本题
查看我的学习进度 →

MCP身份认证授权沙箱与审计图解

🧠 图解记忆: 认证证明是谁,授权限制能做什么,沙箱与审计控制做坏后的影响。

💡 答案要点

认证方式对比:

方式适用场景安全性实现复杂度
无认证(stdio)本地进程⭐⭐⭐⭐⭐极简
API Key内部服务⭐⭐⭐⭐简单
OAuth 2.1企业/云服务⭐⭐⭐⭐⭐中等
Bearer TokenAPI服务⭐⭐⭐简单

OAuth 2.1(2026年MCP标准):

python
# OAuth 2.1认证的MCP Server
from fastmcp.server.auth import OAuth2Server

mcp = FastMCP(
    "企业MCP服务器",
    auth=OAuth2Server(
        issuer="https://auth.company.com",
        client_id="mcp-server-prod",
        scopes=["read", "write"],
        jwks_uri="https://auth.company.com/.well-known/jwks.json"
    )
)

API Key认证(内部使用):

python
# 方式1:环境变量
# 启动时:export MCP_API_KEY=sk-xxx
# server.py
import os

@mcp.tool()
def get_secret_data(keyword: str) -> dict:
    # 验证API Key
    api_key = os.environ.get("MCP_API_KEY")
    if not api_key:
        raise ValueError("MCP_API_KEY not set")

    # 实际业务逻辑
    return search_data(keyword)

OAuth 2.1认证流程:

用户AI → MCP Client → OAuth认证 → MCP Server

              1. 获取Access Token
              2. Token携带Scope权限
              3. Server验证Token + Scope
              4. 执行工具调用

安全最佳实践:

展开 Python 代码示例(45 行)
python
# 1. 输入验证(防止注入)
@mcp.tool()
def safe_search(query: str) -> list:
    # 严格参数校验
    if len(query) > 500:
        raise ValueError("Query too long")

    # SQL注入防护
    sanitized = query.replace("'", "\\'").replace(";", "")
    results = db.execute(
        "SELECT * FROM items WHERE name LIKE ?",
        f"%{sanitized}%"
    ).fetchall()

    return results

# 2. 限流保护
from functools import wraps
import time

rate_limit = {}

def rate_limit_tool(max_calls=100, window=60):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            key = func.__name__
            now = time.time()

            # 清理过期记录
            rate_limit[key] = [t for t in rate_limit.get(key, []) if now - t < window]

            if len(rate_limit.get(key, [])) >= max_calls:
                raise ValueError("Rate limit exceeded")

            rate_limit[key].append(now)
            return func(*args, **kwargs)
        return wrapper
    return decorator

@rate_limit_tool(max_calls=10, window=60)
@mcp.tool()
def expensive_operation(data: str) -> dict:
    # 每分钟最多调用10次
    return process(data)

面试话术:

"MCP Server安全三件套:1)认证用OAuth 2.1,企业标准最安全;2)输入验证防注入,严格校验参数类型和长度;3)限流防滥用,硬编码max_calls防止API被刷。stdio模式下本地进程不需要认证,数据不离开机器安全性最高。云端部署必须走OAuth 2.1,Token带Scope权限控制。"

📚 参考:MCP 官方规范:Authorization(OAuth 2.1)