字
字节笔记本
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、可禁用、可限流、可统计。
分享: