报错排查

配了 API Key,Claude Code 还是提示 Not logged in · Please run /login

已经设置 ANTHROPIC_BASE_URL 和 Key,Claude Code 仍然报 Not logged in。实测发现两种完全不同的原因会给出同一句提示:Key 没被读到(1 秒内报错),或 Key 被服务端拒绝(重试约 3 分钟后才报错)。按等待时间就能分辨,附验证命令。

核实于 2026-11-03 · 更新于 2026-11-03
报错原文
Not logged in · Please run /login
一句话结论

这句提示有两个来源。如果敲完命令 1 秒内就出现,是 Claude Code 根本没读到 Key,一个请求都没发出去;如果等了 3 分钟左右才出现,是 Key 发出去了,但服务端返回 401,Claude Code 重试 10 次后才放弃。两种情况的修法不同。

实测环境:Claude Code 2.1.312,Linux,2026-11-03。用本地假端点记录 Claude Code 实际发出的请求、请求头和重试间隔。

先看等了多久

我们用一个本地假端点,分别模拟「没有 Key」和「Key 错误(服务端回 401)」,记录 Claude Code 发出的每个请求:

情况 发出的请求数 多久后出现提示 最终提示
没设 Key,或 ANTHROPIC_AUTH_TOKEN=(空值) 0 约 1 秒 Not logged in · Please run /login
Key 错误,服务端回 401 11(首次 + 重试 10 次) 约 190 秒 Not logged in · Please run /login
Key 错误,且设 CLAUDE_CODE_MAX_RETRIES=0 1 约 1 秒 Not logged in · Please run /login

401 时的重试间隔实测为 0.5、1、2.4、4.5、9.3、19.6 秒,之后每次约 37~40 秒。所以「卡了几分钟,最后提示要登录」几乎一定是 Key 被拒,而不是没配。

这句提示本身有误导性:使用第三方端点时,/login 走的是 Anthropic 官方账号登录,和你的 Key 无关,照着提示去登录解决不了问题。

情况一:1 秒内就报错,Key 没被读到

Claude Code 只认两个变量,读到哪个就发哪种请求头(实测):

变量 实际发出的请求头
ANTHROPIC_AUTH_TOKEN Authorization: Bearer <你的 Key>
ANTHROPIC_API_KEY x-api-key: <你的 Key>

两个都没有、或者值是空字符串时,Claude Code 不会发任何请求。逐项排查:

  1. 变量是不是在当前窗口里:在运行 claude 的同一个终端执行

bash echo "${ANTHROPIC_BASE_URL}" echo "${ANTHROPIC_AUTH_TOKEN:0:8}" # 只看前 8 位,确认非空

输出为空,说明变量没进这个 shell。常见原因:写进了 ~/.bashrc,但当前用的是 zsh(要写 ~/.zshrc);改完没有重新打开终端,也没有 source。 2. Windows 上用了 setx:setx 只对之后新开的窗口生效,当前窗口读不到。关掉终端重开,或者在 PowerShell 里用 $env:ANTHROPIC_AUTH_TOKEN="..." 先临时设置。 3. 写在 settings.json 里,但位置不对:变量要放在 ~/.claude/settings.json 的 "env" 对象里面,放在顶层不会生效:

json { "env": { "ANTHROPIC_BASE_URL": "https://你的端点地址", "ANTHROPIC_AUTH_TOKEN": "你的 Key" } }

  1. 在 IDE 插件里启动:VS Code、JetBrains 的终端不一定继承你在系统终端里设置的变量。最稳的做法是写进 settings.json,所有入口都能读到。

不想手写,可以用 Claude Code 配置生成器 按系统和 shell 生成可以直接粘贴的配置。

情况二:等了几分钟才报错,Key 被服务端拒绝

这时 Key 已经发出去了,问题出在 Key 本身。绕过 Claude Code,用 curl 直接看服务端返回了什么:

curl -s "$ANTHROPIC_BASE_URL/v1/messages" \
  -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-4-6","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'

返回体里的 error.message 才是真正的原因。常见的几种:

  • 复制时带进了空格或换行:从网页、聊天软件复制的 Key 末尾常多一个换行。重新复制,或者用 printf %s "$ANTHROPIC_AUTH_TOKEN" | od -c | tail -3 看末尾有没有 \n。
  • Key 已禁用或订阅已过期:服务端会明确写出来,这种情况换 Key 或续订即可,改本地配置没有用。
  • 端点和 Key 不配套:Claude Code 的 Key 填到了别家的地址,或者反过来。不同服务的 Key 互不通用。

第三方客户端提示「API key required」

如果你用的不是 Claude Code,而是脚本、Cline 之类的第三方工具,服务端可能会返回:

API key required. Use 'x-api-key' or 'Authorization: Bearer' header

意思是这次请求两种请求头都没带。前面的实测说明,Claude Code 在没有 Key 时根本不会发请求,所以看到这句报错时,发请求的基本都是别的客户端。检查那个工具的 Key 填在了哪一栏,以及它是否按 Anthropic 协议发请求头。在 Code2AI,Claude Code 的 Key 可以用于第三方客户端,但不推荐:第三方工具在上下文自动压缩等方面普遍不如官方客户端完善,长任务更容易中断。

常见问题

为什么没 Key 和 Key 错误会提示同一句话?

Claude Code 把这两种情况都归为「没有可用的凭据」,统一提示去登录。区别只体现在发了几次请求、等了多久。用第三方端点时,排查要看等待时间,或者直接用 curl 测。

ANTHROPIC_AUTH_TOKEN 和 ANTHROPIC_API_KEY 用哪个?

看服务方的文档要求。实测前者发 Authorization: Bearer,后者发 x-api-key。Code2AI 两种请求头都接受,文档统一写 ANTHROPIC_AUTH_TOKEN。不要两个同时设置成不同的值,排查时会分不清用的是哪一个。

能不能让报错快一点出来,不用等 3 分钟?

可以。临时加 CLAUDE_CODE_MAX_RETRIES=0 运行一次,实测 1 秒内就会返回。排查完记得去掉,正常使用时自动重试能扛住偶发的网络抖动。