Claude Code 报 403?按这份清单逐步排查
Claude Code 的 403 意味着请求到达了某个服务器并被拒绝——这其实是好消息,因为原因几乎总在五件本地小事里:环境变量没设全、base URL 写错、残留的登录会话、Key 被禁用,或官方端点拒绝你所在的网络。按顺序过一遍这份清单,每步不超过一分钟。
第 1 步——三个环境变量都要设
Claude Code 需要 base URL 加上两个密钥变量。只设 ANTHROPIC_API_KEY 是 403/401 的头号成因:不同版本的 Claude Code 会用 ANTHROPIC_AUTH_TOKEN 做认证。三个都设上,然后重启终端让会话真正读到它们:
export ANTHROPIC_BASE_URL=https://api.router.one export ANTHROPIC_API_KEY=sk-your-router-one-key export ANTHROPIC_AUTH_TOKEN=sk-your-router-one-key
第 2 步——逐字核对 base URL
Anthropic 兼容端点是 https://api.router.one——结尾没有 /v1。从 OpenAI 风格配置里照抄 /v1 后缀,请求就会打到 Anthropic 兼容面上不存在的路径。如果之前把 Claude Code 指过别的中转,还要检查 ~/.zshrc、~/.bashrc 或 shell profile 里有没有残留的 ANTHROPIC_BASE_URL 把你刚设的值覆盖掉。
第 3 步——清理残留凭据
如果这台机器上的 Claude Code 曾登录过官方服务,存储的会话可能优先于环境变量生效——你以为在调一个端点,工具实际在向另一个端点认证。在 Claude Code 里退出登录(或清除其存储的凭据),重启终端,并在同一会话里用 `echo $ANTHROPIC_BASE_URL` 确认变量可见。
第 4 步——核实 Key 本身
到 Dashboard → API Keys 确认 Key 处于启用状态、消费上限(maxSpend)没有用尽——被禁用或额度耗尽的 Key 无论本地配置多正确都会拒绝请求。Dashboard → Logs 能告诉你请求到底有没有到达网关:那里什么都没有,说明问题在本地(第 1–3 步);出现了 4xx 记录,trace 会指出你撞上的是哪条限制。
中国大陆场景
从中国大陆直连官方 Anthropic 端点,常因供应商侧的地区限制而返回 403 或连接失败。Router One 网关在大陆可直连、无需 VPN,所以上面同样的三个环境变量就是大陆场景的解法——不存在额外的特殊配置。
常见问题
- 为什么 ANTHROPIC_API_KEY 和 ANTHROPIC_AUTH_TOKEN 都要设?
- 不同版本的 Claude Code 读取的认证变量不同。把两个变量设成同一个 Router One Key 没有任何成本,却能消掉一整类跟版本相关的 401/403。
- 变量设了,Claude Code 还是 403。
- 在启动 Claude Code 的同一个终端会话里打印它们:echo $ANTHROPIC_BASE_URL。如果为空,说明 export 写在了别的 shell 或 profile 文件里。另外检查是否有存储的官方服务登录会话在覆盖环境变量(第 3 步)。
- base URL 结尾要不要带 /v1?
- 不要——Claude Code 用的 Anthropic 兼容 base URL 是 https://api.router.one,不带 /v1。/v1 后缀属于 Codex CLI 和 OpenAI SDK 使用的 OpenAI 兼容端点。
- 怎么确认请求真的到了网关?
- Dashboard → Logs 记录包括失败在内的每个请求。如果 Claude Code 的尝试完全没出现在那里,说明请求根本没有正确离开你的机器——回到第 1–3 步;如果出现了错误状态记录,trace 会精确指出是哪条限制或 Key 问题。
- 在中国大陆这套配置能用吗?
- 能。网关在大陆可直连、无需 VPN,配置与全球环境完全一致——就是那三个环境变量。