Claude Code 报 401 或 403?按这份 清单逐步 排查
Claude Code 报 401 或 403,意味着请求到达了某个服务器并被拒绝——这其实是好消息,因为原因几乎总在五件本地小事里:环境变量没设全、base URL 写错、残留的登录会话、Key 被禁用,或官方端点拒绝你所在的网络。先对照报错原文,再按顺序过一遍这份清单,每步不超过一分钟。
先对照报错 原文
Claude Code 的官方错误说明(https://code.claude.com/docs/en/errors)为登录与凭据问题列出了下面这些报错。把 Claude Code 指向 Router One 时,每条报错的含义和对应的修复步骤如下:
| 报错原文 | 在这里意味着什么 | 修复 |
|---|---|---|
| Not logged in · Please run /login | 当前 Claude Code 会话里没有可用的凭据:既没有登录,也没有读到 ANTHROPIC_AUTH_TOKEN。 | 接 Router One 不要执行 /login,它登录的是 Anthropic 官方服务。设好 ANTHROPIC_BASE_URL 和 ANTHROPIC_AUTH_TOKEN(第 1 步),然后重启 Claude Code。 |
| Invalid API key | ANTHROPIC_API_KEY 里的值被拒绝了,常见的是 shell 配置文件或 ~/.claude/settings.json 里残留的旧 Key。 | unset ANTHROPIC_API_KEY(接 Router One 不需要设置它),从配置文件里删掉,再把 Router One 的 Key 填进 ANTHROPIC_AUTH_TOKEN(第 1 步)。 |
| Invalid auth token · Fix external auth token | ANTHROPIC_AUTH_TOKEN 里的值被拒绝了。 | 重新完整粘贴 Router One 的 Key(sk- 加 64 位十六进制字符,不带引号、末尾没有空格),再到控制台 → API 密钥确认该 Key 已启用、没有过期(第 4 步)。 |
| API Error: 401 Invalid authentication credentials | Claude Code 调用的端点拒绝了它发出的凭据。 | 确认 ANTHROPIC_BASE_URL 正好是 https://api.router.one(第 2 步),并且发出去的是你当前的 Router One Key(第 1、4 步)。 |
| Login expired · Please run /login | Claude Code 仍在使用存储的登录会话(通常是以前登录官方服务留下的),而没有用你设的网关变量。 | 在 Claude Code 里执行 /logout,确认同一会话里设了 ANTHROPIC_AUTH_TOKEN,然后重启(第 3 步)。 |
第 1 步——设 base URL 和认证 Token
接第三方网关时,Claude Code 用 ANTHROPIC_AUTH_TOKEN 做认证,而不是 ANTHROPIC_API_KEY。只设 ANTHROPIC_API_KEY 是 403/401 的头号成因。ANTHROPIC_API_KEY 并不需要设置,而且当前版本设了它会多弹一次授权确认;如果你之前设过,请取消。设好下面两个变量后重启终端,让会话真正读到它们:
export ANTHROPIC_BASE_URL=https://api.router.one export ANTHROPIC_AUTH_TOKEN=sk-your-router-one-key unset ANTHROPIC_API_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 里用 /logout 退出登录(或清除其存储的凭据),重启终端,并在同一会话里用 echo $ANTHROPIC_BASE_URL 确认变量可见。
第 4 步——核实 Key 本身
到控制台 → API 密钥确认 Key 处于启用状态、消费上限(maxSpend)没有用尽——被禁用或额度耗尽的 Key 无论本地配置多正确都会拒绝请求。控制台 → 日志能帮你判断问题出在哪一侧:那里什么都没有,就先看 Claude Code 打印的状态码——请求要么没到达网关,要么在调用任何模型之前就被拒绝了:Key 校验没过(401,回到第 1–3 步)、余额不足或 Key 达到 maxSpend 上限(402,充值或调高 maxSpend)或命中 Key / 账户限额(429),这些都不会生成用量记录;出现了错误状态的记录,记录里的状态码和错误信息会指出原因。
中国 大陆场景
从中国大陆直连官方 Anthropic 端点,常因供应商侧的地区限制而返回 403 或连接失败。Router One 网关在大陆可直连、无需 VPN,所以上面同样的两个环境变量就是大陆场景的解法——不存在额外的特殊配置。
常见 问题
Claude Code 提示 Not logged in · Please run /login,要执行 /login 吗?
接 Router One 不需要。/login 登录的是 Anthropic 官方服务,存下来的登录会话之后还可能优先于你的环境变量。这条报错说明会话里没有可用的凭据:在 ~/.claude/settings.json 或启动 Claude Code 的 shell 里,把 ANTHROPIC_BASE_URL 设为 https://api.router.one、ANTHROPIC_AUTH_TOKEN 设为你的 Router One Key,然后重启 Claude Code。
还需要设 ANTHROPIC_API_KEY 吗?
不需要。接第三方网关时 Claude Code 认的是 ANTHROPIC_AUTH_TOKEN。ANTHROPIC_API_KEY 不是必需的,当前版本设了它启动时会多弹一次授权确认;如果之前设过,请在同一个 shell 里 unset,并从 ~/.zshrc 或 ~/.bashrc 里删掉。Router One 的一键安装脚本只会往 ~/.claude/settings.json 写 ANTHROPIC_BASE_URL 和 ANTHROPIC_AUTH_TOKEN。
变量设了,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 兼容端点。
怎么 确认 请求真的 到了 网关?
控制台 → 日志记录网关已发往模型的请求(包括失败的请求),并可按 API Key 筛选。如果 Claude Code 的尝试完全没出现在那里,这只是线索,不能单独下结论:请求可能没到达网关,也可能在调用任何模型之前就被拒绝——Key 校验没过(401)、余额不足或 Key 达到 maxSpend 上限(402)、命中 Key / 账户限额(429)——这些都不会生成用量记录。先看 Claude Code 打印的状态码,401 就回到第 1–3 步;如果出现了错误状态的记录,记录里的状态码和错误信息会指出原因。
在中国 大陆这套 配置能用吗?
能。网关在大陆可直连、无需 VPN,配置与全球环境完全一致——就是那两个环境变量。