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 不会发任何请求。逐项排查:
- 变量是不是在当前窗口里:在运行
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"
}
}
- 在 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 秒内就会返回。排查完记得去掉,正常使用时自动重试能扛住偶发的网络抖动。