ByteNoteByteNote

字节笔记本

2026年5月1日

MCP Server 转发实战:Cloudflare Worker 多用户鉴权方案

API中转
¥120

MCP (Model Context Protocol) Server 的转发是隐藏上游 API Key、统一入口地址的常见需求。本文以智谱 BigModel MCP 为例,给出 Cloudflare Worker 转发方案,以及多用户鉴权的生产级实现。

为什么需要转发

原始配置:

json
{
  "mcpServers": {
    "web-search-prime": {
      "type": "http",
      "url": "https://open.bigmodel.cn/api/mcp/web_search_prime/mcp",
      "headers": {
        "Authorization": "Bearer your_api_key"
      }
    }
  }
}

问题:API Key 暴露在客户端配置中,无法分享、无法管控。

转发后的客户端只需连接你的地址,无需知道上游 Key。

单用户转发(最简单)

javascript
const TARGET = "https://open.bigmodel.cn/api/mcp/web_search_prime/mcp";

export default {
  async fetch(request, env) {
    if (request.method === "OPTIONS") {
      return new Response(null, { status: 204 });
    }

    const headers = new Headers(request.headers);
    headers.set("Authorization", `Bearer ${env.BIGMODEL_API_KEY}`);
    headers.set("Host", "open.bigmodel.cn");

    const res = await fetch(TARGET, {
      method: request.method,
      headers,
      body: request.method === "GET" || request.method === "HEAD"
        ? undefined
        : request.body,
    });

    const out = new Headers(res.headers);
    out.set("Access-Control-Allow-Origin", "*");

    return new Response(res.body, {
      status: res.status,
      headers: out,
    });
  }
};

环境变量: BIGMODEL_API_KEY=你的真实Key

客户端配置:

json
{
  "mcpServers": {
    "web-search-prime": {
      "type": "http",
      "url": "https://你的worker.workers.dev"
    }
  }
}

多用户鉴权(生产推荐)

核心思路:给每个用户发一个代理 Token,Worker 校验后替换为真实的 BigModel Key。

Worker 代码

javascript
const TARGET = "https://open.bigmodel.cn/api/mcp/web_search_prime/mcp";

export default {
  async fetch(request, env) {
    if (request.method === "OPTIONS") {
      return new Response(null, { status: 204 });
    }

    const userToken = getBearerToken(request);
    if (!userToken) {
      return json({ error: "missing token" }, 401);
    }

    const userRaw = await env.USERS_KV.get(`token:${userToken}`);
    if (!userRaw) {
      return json({ error: "invalid token" }, 401);
    }

    const user = JSON.parse(userRaw);
    if (!user.enabled) {
      return json({ error: "disabled" }, 403);
    }

    const headers = new Headers(request.headers);
    headers.set("Authorization", `Bearer ${env.BIGMODEL_API_KEY}`);
    headers.set("Host", "open.bigmodel.cn");
    headers.set("X-User-Id", user.userId);

    return fetch(TARGET, {
      method: request.method,
      headers,
      body: request.method === "GET" || request.method === "HEAD"
        ? undefined
        : request.body,
    });
  }
};

function getBearerToken(req) {
  const auth = req.headers.get("Authorization") || "";
  const m = auth.match(/^Bearer\s+(.+)$/i);
  return m ? m[1].trim() : null;
}

function json(data, status) {
  return new Response(JSON.stringify(data), {
    status,
    headers: { "Content-Type": "application/json" },
  });
}

KV 添加用户

bash
wrangler kv key put "token:sk-user-a-xxxx" \
'{"userId":"user_a","enabled":true}' \
--binding=USERS_KV

客户端配置

json
{
  "mcpServers": {
    "web-search-prime": {
      "type": "http",
      "url": "https://你的worker.workers.dev",
      "headers": {
        "Authorization": "Bearer sk-user-a-xxxx"
      }
    }
  }
}

三种多用户模式对比

模式架构适用场景
共用上游 Key用户 → Worker → 同一个 BigModel Key自己用或小范围信任用户
代理 Token + 共用上游 Key(推荐)用户 Token → Worker 校验 → 替换为 BigModel Key生产环境,可控可禁用
用户自带 Key用户 BigModel Key → Worker 透传不承担费用,但无法管控

推荐第 2 种:给每个用户发代理 Token,Worker 内部替换为真实 Key。

生产建议

  • 限流:按用户 Token 在 KV 中记录调用次数,或使用 Cloudflare Rate Limiting
  • 日志:通过 X-User-Id 标记用户,方便排查
  • 禁用:改 KV 中 enabled: false 即可即时封禁用户
  • SSE 流式:直接透传 res.body,不要 await res.text()

一句话总结

多用户不要让他们直接拿你的 BigModel Key。给每个用户发一个代理 Token,CF Worker 校验后替换为真实 Key 转发。这样可以做到一人一 Key、可禁用、可限流、可统计。

分享: