“Login expired · Please run /login”表示 Claude Code 尝试自动续期已保存的登录时遭到拒绝,并且已经删除了保存的凭据。在这种状态下发出的指令不会发送到 API,而是停在本地。用 /login 重新登录即可恢复;一直重试,提示也不会变。
Login expired · Please run /login
在非交互模式(claude -p)和 Agent SDK 中,同一状态会以下面的文字显示(结构化错误代码为 authentication_failed)。
Failed to authenticate: OAuth session expired and could not be refreshed
先看提示的原文
要求“/login”的提示不止一种
已保存登录的续期被拒绝,凭据已被删除
本会话根本没有可用的凭据
API 拒绝了已发出的请求
不是登录问题,而是账户本身被暂停
重新登录也不会消失
目录
1. Login expired 到底是什么过期了
根据 Claude Code 官方错误参考,出现这个提示的过程如下。过期的是你通过 /login 保存在本地的 claude.ai 或 Claude Console 登录(OAuth 凭据)。
续期失败的那一刻,保存的凭据就已经被删除了
① 已保存的登录
通过 /login 保存的 claude.ai 或 Claude Console 登录
② 尝试自动续期
Claude Code 用保存的刷新令牌请求续期
③ 被拒绝并删除
OAuth 认证服务拒绝续期,Claude Code 删除保存的凭据
④ 在发送前停下
之后的指令停在本地,显示 Login expired。只有 /login 能生成新的凭据
关键在第④步。Claude Code 已经删除了凭据,所以不会把请求发送到 API。无论重发多少次都会显示同样的提示,原因就在这里;官方也写道:“不登录就重试,每次都会得到同样的消息”。官方的说明只到“续期被拒绝”这一事实为止,没有给出被拒绝的具体原因。不过官方明确说明,如果原因不是登录太旧而是账户本身被停用,就会显示另一个提示“Your account is on hold”。
从 v2.1.206 起改为这个提示
根据官方错误参考,v2.1.206 之前的 Claude Code 在登录无法续期时,仍会用环境中残留的凭据继续发送请求。结果是无论选择哪个模型,都会出现“There's an issue with the selected model”或 401 错误,而不会提示你登录。官方 CHANGELOG 的 v2.1.206 条目也写着“修复了过期的登录以误导性的模型错误失败、而不是提示 /login 的问题”(在 npm 上的发布日期为 2026 年 7 月 9 日,UTC)。如果你在用旧版本,而且所有模型都报模型错误,请先试试 /login。
不会出现这个提示的认证方式
使用 API 密钥(ANTHROPIC_API_KEY)、用 claude setup-token 生成的长期令牌(CLAUDE_CODE_OAUTH_TOKEN),或通过 Amazon Bedrock 等云服务商认证的会话,不使用已保存的登录,因此不会出现这个提示。反过来说,出现 Login expired 的会话,一直是以已保存的登录作为有效凭据的。
提前 3 天会有预告
根据官方认证文档,从 v2.1.203 起,当已保存登录距离到期不足 3 天时,启动时会显示下面的警告(v2.1.217 之前是提前 5 天)。这个警告只是提示信息,到期之前认证仍然可用。
Your login expires in 3 days · run /login to renew
提前续期最有用的是无人值守运行的会话。agent view 的后台会话或 Remote Control 的会话如果跨过了登录的到期时间,凭据失效后就会停止推进,直到重新登录才会恢复。
2. 与 Not logged in、OAuth token expired 的区别
这些提示最后都要求 /login,但发生的事情不同,请求是否到达 API 也不同。把官方错误参考中的说明并列如下。
| 提示 | 发生了什么 | 是否发送到 API | 解决方法 |
|---|---|---|---|
| Login expired · Please run /login | 已保存登录的续期被拒绝,凭据已被删除 | 不发送(停在本地) | /login |
| Not logged in · Please run /login | 本会话没有可用的凭据 | ― | /login,或确认预期的环境变量是否已被读取 |
| OAuth token revoked · Please run /login/…401 OAuth token has expired… | API 拒绝了已发出的请求(从所有设备退出登录、被管理员删除、会话中自动续期失败) | 已发送,返回 401 | /login。同一会话中再次出现则 /logout→/login |
| Please run /login · API Error: 401 Invalid authentication credentials | 凭据格式通过了,但被账户或组织一方拒绝 | 已发送,返回 401 | 先用 /status 确认有效的凭据再处理 |
| Your account is on hold… | 账户被暂停(v2.1.235 之前显示为 Login expired) | ― | 通过提示中的链接查看详情或提出申诉 |
| Remote Control disconnected — Claude.ai login expired — … | 只有 Remote Control 的连接停止了,本地会话仍在继续 | ― | /login。视提示内容再运行 /remote-control |
可以这样记:Not logged in 是“一开始就没有凭据”,Login expired 是“原本有,但续期失败被删除了”。出现 Not logged in 时,也可能是你打算使用的 ANTHROPIC_API_KEY 没有在启动 Claude Code 的 shell 中加载。Not logged in 的原因,以及 API 密钥环境变量为何会优先于订阅登录,请参阅 Claude Code 的认证与登录错误(Not logged in/Invalid API key)一文。
与 OAuth token has expired 的区别在于,发生在发送到 API 之后还是之前。官方的说明是:“如果续期失败后已保存的登录已经被删除,则会改为显示 Login expired”。名字相似的 Anthropic profile login expired 只在使用通过 ANTHROPIC_PROFILE 等选择的 Anthropic 凭据配置文件时才会出现,使用 claude.ai 登录的会话不会出现。
3. 用 /login 重新登录的步骤
出现这个提示的那次请求本身并没有到达 API。不过,如果是在一轮对话的中途出现,此前的文件编辑或命令可能已经执行完毕,原样重发同一条指令有可能导致重复执行。重发之前,请先确认进行到了哪一步。
确认过期的是哪个账户
在输入框中打开 /status。根据官方文档,从 v2.1.210 起,Login 一行会显示 Expired — log in again,同时显示过期登录中保存的组织和邮箱。只有当已保存的登录是有效凭据时,才会显示这一行。如果你在多个账户之间切换使用,就在这里记下要重新登录的账户。
运行 /login,用同一个账户登录
浏览器会打开。订阅用户用 claude.ai 账户登录,按 API 计费的用户用 Claude Console 账户登录。如果浏览器没有打开,按 c 复制 URL,粘贴到本机的浏览器中。在 WSL2、SSH、容器中,登录后浏览器可能会显示登录代码,这时把它粘贴到终端的 Paste code here if prompted 处。看到 Login successful 后按 Enter 返回。
粘贴代码无效时,从 shell 登录
如果终端无法把内容粘贴到输入框,可以试试 Windows Terminal 的右键或 Shift+Insert 等其他粘贴方式。仍然不行,就在 shell 中运行 claude auth login。这个命令从标准输入读取粘贴的代码,官方说明它在原生 Windows 上也能使用。
先用简短指令确认有回复,再回到工作中
不要马上发送原来的大指令,先发一条不涉及文件操作的简短确认。收到回复后,确认进度,再重发之前记下的指令。
# 在 Claude Code 的输入框中
/status
/login
# 无法粘贴到输入框时(在 shell 中运行)
claude auth login
在 claude -p 或 CI 中出现时
非交互模式无法在浏览器中登录。官方的做法是:在同一环境中先以交互模式启动一次 claude,完成 /login 后,再重新运行原来的命令。无法交互登录的自动化场景,使用 Console 的 API 密钥(ANTHROPIC_API_KEY,按 API 用量计费),或用 claude setup-token 生成的长期令牌。
claude setup-token
# 在浏览器中批准后,终端会显示令牌(不会保存到任何地方)
export CLAUDE_CODE_OAUTH_TOKEN=显示的令牌
根据官方认证文档,这个令牌有效期为 1 年,需要 Pro、Max、Team、Enterprise 其中之一的套餐。它只能用于向模型发送请求,不能用于 Remote Control 或 claude.ai 的连接器。加了 --bare 的运行不会读取这个变量,此时要用 API 密钥或 apiKeyHelper。另外,这个令牌本身过期或失效时,显示的不是 Login expired,而是 OAuth token revoked/expired。
登录本身失败时
官方故障排除文档给出的、在找不到原因时的重置步骤是:/logout→关闭 Claude Code→用 claude 重新启动并登录。/logout 还会重置首次启动时的设置状态,所以下次启动时需要重新登录并重新完成初始设置。所有保存的凭据都会被删除,MCP 服务器的登录和插件的密钥值也需要重新填写。如果出现 OAuth error: Invalid code,原因是登录代码过期或复制时缺了字符,因此浏览器打开后要马上完成操作,并用 c 完整复制 URL。
4. 确认是否已经恢复
不要因为一次没有报错就认为已经解决,请用下面三点来确认。
/status 的显示
Login 行的 Expired — log in again 是否消失,组织和邮箱是否是你想用的账户。登录和 API 密钥同时存在时,未被使用的一方会带有标记
claude auth status 的退出码
根据官方 CLI 参考,已登录时以 0 结束,未登录时以 1 结束。可用于脚本的事前检查
能否收到简短回复
发往模型的请求是否真的能通过,要收到回复才知道。确认用的消息也会照常计入用量
# 以人类可读的格式显示
claude auth status --text
# 查看退出码(macOS、Linux)
claude auth status; echo $?
# 查看退出码(PowerShell)
claude auth status; $LASTEXITCODE
确认回复时,可以发送类似下面的消息。
这是连接测试。请不要读写文件或调用工具,
只回复“已收到”。
5. 反复出现时要检查的地方
如果只出现一次,/login 就解决了。如果每隔几天、甚至几乎每天都出现,请从上往下检查下面几项。它们都写在官方文档或 CHANGELOG 中,没有凭推测添加的项目。首先看看版本是否过旧。
claude --version
claude update
并行会话与从睡眠中恢复
据官方说明,同一台机器上的并行会话共享已保存的登录,续期每次只由一个进程进行。v2.1.211 之前,从睡眠中恢复时两个会话可能用同一个令牌续期,导致已保存的登录失效,所有会话同时要求重新登录
同一台机器上运行着旧版本
CHANGELOG 的 v2.1.277 写着“修复了 IDE 扩展内置的 CLI 等旧版本在同一台机器上运行时,会意外退出登录的问题”。当时出现的提示原文没有写明。请同时更新 CLI 和 IDE 扩展
macOS 的钥匙串
如果钥匙串被锁定,或其密码与账户密码不一致,写入会被拒绝,登录会以明文保存在 ~/.claude/.credentials.json 中。请按下面的步骤恢复到可写入的状态。2026 年 9 月 26 日补充:CHANGELOG 的 v2.1.281 写着“修复了在钥匙串被锁定时(如刚从睡眠中恢复)写入,可能导致钥匙串条目被删除的问题”
系统时钟
官方故障排除文档指出,令牌的验证依赖正确的时间,因此如果频繁被要求登录,应确认时钟是否准确。请开启操作系统的自动校时
多个账户与 CLAUDE_CONFIG_DIR
设置了 CLAUDE_CONFIG_DIR 后,凭据会放在该文件夹中,macOS 钥匙串的条目也会按文件夹分开。如果用与出现提示的会话不同的值运行 /login,登录会存到另一个位置
重新登录后提示依旧
v2.1.235 之前,账户被暂停也会显示为 Login expired。如果在旧版本中 /login 后提示仍不消失,请先更新再重新看提示
在 macOS 上把钥匙串恢复到可写入的状态
以下是官方故障排除文档中的步骤。如果 claude doctor 的报告中没有以 macOS Keychain is not writable 开头的警告,说明钥匙串可以写入,只需执行第 4 步。
- 用
claude doctor检查对钥匙串的访问 - 如果有警告,用下面的命令解锁,再运行一次
claude doctor - 解锁后警告仍在,就在 Keychain Access(钥匙串访问)中选择
login钥匙串,通过官方步骤中的Edit > Change Password for Keychain "login"(英文界面中的菜单项名称),使其与账户密码一致 - 警告消失后,用
/logout→/login重新登录。登录会重新保存到钥匙串中
claude doctor
security unlock-keychain ~/Library/Keychains/login.keychain-db
换成 API 密钥,这个提示就不会再出现吗
不会再出现,但计费方式会改变。按照官方的优先级,ANTHROPIC_API_KEY 经你批准后会优先于 /login 的登录,在 -p 非交互模式下只要设置了就总是会被使用。这期间的用量不走订阅,而是按 Console 的 API 用量计费。仅仅因为“想避开 Login expired”就设置 API 密钥,并不推荐。如果目的是无人值守运行,订阅也能使用的 claude setup-token 更合适。
6. 有人报告但原因尚未确定的案例
Claude Code 的 GitHub 仓库中有包含这段原文的缺陷报告。我们在 2026 年 9 月 22 日打开并阅读了下面 6 条。它们都是用户的报告或推测,在我们读到的范围内,没有 Anthropic 的公开答复。症状相同,原因未必相同,请不要把它们当作操作步骤照搬,而是用来参考情况是否相似。
- #94464(macOS,CLI 2.1.270):在 Claude 桌面应用内置的 Claude Code 与终端 CLI 共用同一个
~/.claude的环境中,终端一侧几乎每天都出现 Login expired。报告者推测,内置版续期后的令牌只写入了文件,钥匙串中仍留着旧令牌。后续补充中有人报告 2.1.273 也有同样症状 - #88583(macOS,桌面应用内置 2.1.229):报告称并行会话争抢续期,钥匙串中的凭据被清空。后续补充中还有 Windows 2.1.251 出现
Failed to authenticate: OAuth session expired and could not be refreshed的例子 - #88947(Linux,2.1.228~2.1.240):在 10~24 个交互会话共用一个
~/.claude的环境中,每隔不到一周所有会话都会变成 Login expired - #95822(macOS):指出像
claude auth status这类很快结束的命令会在启动时开始续期,却在保存结果之前退出,导致留下已用过的刷新令牌。当时有监控工具每隔几分钟运行一次(观测于 2.1.259)。第 4 章中的claude auth status,最好避免以很短的间隔反复运行 - #83834(Windows,2.1.221):报告称刚登录后就出现 Login expired,保存文件中的有效期值为 0。后续补充称 Linux 2.1.241 也有同样情况
- #80605(macOS,2.1.218):报告称删除凭据和钥匙串并重新安装后提示仍在,
/login也没有出现登录界面。第二天可以登录了,但报告者写道不知道是什么起了作用(已关闭)
前 4 条的共同点是:一台机器上有多个进程在使用同一个已保存的登录。如果反复出现,记下同时运行的 Claude Code 的数量(终端 CLI、IDE 扩展、桌面应用、后台会话),报告时就能准确说明情况。
7. 仍然无法解决时要留下的信息
官方故障排除文档列出了问题无法解决时的以下 4 个途径。
- 用
claude doctor生成自动诊断报告 - 如果能打开会话,在输入框中用
/feedback报告 - 在 GitHub 的 Issue 中查找已知问题,如果没有,附上操作系统、安装方式和完整的错误信息新建报告
- 如果是登录循环等账户一方的问题,登录 claude.ai(Console 用户则为 platform.claude.com),点击左下角的姓名首字母,通过“Get help”联系支持
报告记录模板
- 环境
claude --version的结果/操作系统/安装方式(原生、npm、桌面应用内置等)- 提示
- 完整的错误信息/发生时间和时区/
/status的 Login 行(隐去邮箱) - 情况
- 同时运行的 Claude Code 的数量和种类/是否刚从睡眠中恢复或刚更新
- 尝试过的操作
/login、/logout、检查钥匙串等操作前后有什么变化
8. 总结
“Login expired · Please run /login”是在已保存登录的续期被拒绝、Claude Code 删除凭据之后出现的提示。请求停在本地,所以重试无法解决;如果要继续使用已保存的登录,只能用 /login 重新登录。用 /status 确认过期的账户,用同一个账户登录,再用简短回复确认,就完成了。
如果反复出现,请依次检查:版本更新、同一台机器上运行的旧版本或 IDE 扩展、macOS 钥匙串、时钟、CLAUDE_CONFIG_DIR。它与根本没有凭据的 Not logged in、被 API 拒绝的 OAuth token has expired 处理方法不同,所以请先比对提示的原文。其他错误整理在 Claude Code 常见错误与解决方法汇总中。
FAQ
Q. “Login expired · Please run /login”是什么意思?
A. 表示 Claude Code 尝试自动续期已保存的登录时被拒绝,并删除了保存的凭据。之后的请求不会发送到 API,而是停在本地。用 /login 重新登录即可恢复。
Q. 多重试几次能恢复吗?
A. 不能。凭据已经被删除,官方也说明“不登录就重试,每次都会得到同样的消息”。只有 /login 能生成新的凭据。
Q. 这是说订阅到期了吗?
A. 仅凭这个提示无法判断。官方的说明是已保存登录的续期被拒绝。如果账户本身被暂停,会显示另一个提示“Your account is on hold”。套餐状态请在重新登录后通过 /status 或 claude.ai 的设置页面确认。
Q. 和 Not logged in 有什么不同?
A. Not logged in 是本会话一开始就没有可用凭据的状态。Login expired 是原本有已保存的登录,但续期失败被删除的状态。解决方法都是 /login,但出现 Not logged in 时,还要确认打算使用的环境变量是否已被加载。
参考的一手资料
- Claude Code — Error reference(官方文档):Login expired、Not logged in、OAuth token revoked or expired、Your account is on hold、Remote Control 各提示的定义,以及 v2.1.206、v2.1.235 的变更
- Claude Code — Authentication(官方文档):凭据的保存位置、到期前 3 天的警告、
/status的 Login 行、认证的优先级、claude setup-token - Claude Code — Troubleshoot installation and login(官方文档):重置登录、在 WSL2 和 SSH 中粘贴代码、并行会话的续期、macOS 钥匙串的恢复步骤、支持渠道
- Claude Code — CLI reference(官方文档):
claude auth login、claude auth status的退出码 - anthropics/claude-code — CHANGELOG(官方):v2.1.203(到期前的警告)、v2.1.206(从模型错误改为提示 /login)、v2.1.211(从睡眠恢复时集体退出登录)、v2.1.217(警告改为提前 3 天)、v2.1.277(旧版本共存导致退出登录)、v2.1.281(向锁定的钥匙串写入)
- GitHub Issue:#94464、#88583、#88947、#95822、#83834、#80605(均为用户报告,2026 年 9 月 22 日确认)