问题出现得很突然,日志倒是留得挺全。为了防前端泄露,在 Google AI Studio 给 key 加了 HTTP 引荐来源限制,填的是 https://app.example.com/*,加完之后浏览器里正常,Node 服务端用同一个 key 调 generateContent 全部 403,原文 PERMISSION_DENIED: Requests from referer
刚开始盯着「IP 白名单填的是办公网 NAT 出口 实际出口有多条」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。服务端请求没有 Referer 头 被限制规则判为空。另一种情况是限制类型选了网站 服务端应该用 IP 限制。
另外,key 同时开了 API 限制 没勾 Generative Language API。
动手时先用 curl 复现并看状态码
curl -s -o /dev/null -w '%{http_code}' 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key='$GEMINI_KEY -H 'Content-Type: application/json' -d '{"contents":[{"parts":[{"text":"hi"}]}]}'
接着把 key 的限制类型改成 IP 地址
python -c "print('switch key restriction to IP addresses')"
然后列出服务端所有出口地址逐个加白
curl -s https://api.ipify.org; curl -s https://ifconfig.me
等前面都确认过,再改完等服务端生效再复测
Start-Sleep -Seconds 300; echo retry
改完先别撤,确认这几项。服务端请求返回 200,candidates 里有内容,curl 的状态码从 403 变成 200。
key 的应用限制对无头请求很苛刻,服务端一律用 IP 限制,前端 key 要么发临时令牌 要么走自己的后端代理。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
