Cloudflare Workers
快速上手:Cloudflare Workers(Service Binding)
适用:你的站点也部署在 Cloudflare Workers、且和账号中心同属 geekhonize.top zone (或任何同 zone 情形)。
为什么必须用 Service Binding
同 zone 内两个挂在 Worker Route 上的 Worker 之间不能用 fetch()——Cloudflare 会直接 返回 error 1042("Worker tried to fetch from another Worker on the same zone, which is unsupported"),并且返回的是 Cloudflare 生成的 HTML 错误页而不是 JSON。如果你用 res.json() + try/catch,最后只剩一句"无法连接账号中心",与真实原因完全无关。
官方文档:<https://developers.cloudflare.com/workers/configuration/routing/custom-domains/#worker-to-worker-communication>
解法二选一:
- Service Binding(推荐,本文采用);
- 把目标 Worker 挂到 Custom Domain(Route 不行)。
跨 zone(比如你部署在自己的账号/域名下)不存在这个问题,直接 fetch https://auth.geekhonize.top 即可——按 服务端接入 走。
配置
# wrangler.toml
[[services]]
binding = "SSO"
service = "geekhonize-sso"
[vars]
SSO_BASE = "https://auth.geekhonize.top"
SSO_CLIENT_ID = "gh_xxxxxxxx"
# SSO_CLIENT_SECRET / SESSION_SECRET 走 wrangler secret put代码
import { createSsoClient } from '@geekhonize/sso-sdk/server';
export default {
async fetch(request, env) {
const sso = createSsoClient({
clientId: env.SSO_CLIENT_ID,
clientSecret: env.SSO_CLIENT_SECRET,
sessionSecret: env.SESSION_SECRET,
ssoBase: env.SSO_BASE,
// 关键一行:注入 Service Binding 的 fetch
fetcher: env.SSO ? (input, init) => env.SSO.fetch(input, init) : undefined,
});
// …其余流程与 Node 版完全一致,见 quickstart-server
},
};fetcher 注入后,SDK 的每次调用都走绑定直达 geekhonize-sso Worker,不出边缘、 不计公网流量、不会撞 1042。忘传 fetcher 时 SDK 的报错文案会直接点名 1042。
自检探针
上线后先用一次请求确认绑定真的通了:
// 你的 Worker 里临时加一条路由
const res = await env.SSO.fetch('https://sso.internal/healthz');
const ct = res.headers.get('content-type') || '';
return new Response(ct.includes('json') ? 'binding ok' : 'binding broken(拿到非 JSON=大概率 1042)');平台站 /healthz?deep=1 的 sso_probe 字段就是这个探针的常驻版,可直接抄。
完整示例见 SDK 仓库 examples/workers/worker.mjs。