故障处理

Codex 登录失败怎么处理?401 与 token exchange failed 排查指南

Codex CLI 登录失败、401 Unauthorized 或 token exchange failed 时,按登录方式、凭据、浏览器回调和远程环境逐步排查,并确认修复是否生效。

浏览器已经显示登录完成,终端却仍报错;或者昨天还能用,今天出现 401 Unauthorized。这两种情况看起来都像“Codex 登录失败”,但检查起点不同:先确认错误发生在登录过程中,还是已经登录后的模型请求中,再选择下面的处理路径。

本文以 Codex CLI 为主。IDE 扩展也可参考凭据部分,但扩展的操作入口不同。不要先删除整个 ~/.codex:里面还可能有配置、规则和会话记录。

先对照错误现象,找到检查起点

你遇到的现象 先检查什么 应看到的结果
codex login 失败,出现 token exchange failed 登录流程、浏览器回调、终端所在机器和网络 登录流程完成后,当前终端的登录状态有效
浏览器显示成功,终端仍等待或未登录 浏览器回调能否到达运行 CLI 的环境 CLI 结束等待,codex login status 能识别登录方式
登录状态有效,开始任务才出现 401 Unauthorized 本次使用的账号、API Key、模型服务配置 凭据与请求的服务匹配,最小请求不再返回 401
403 Forbidden 返回错误的服务、账号或组织权限 先定位访问被拒绝的对象,不把它直接当密码错误
429、rate limit 或额度提示 完整错误正文中的限流或额度原因 按对应限制处理,不连续重登
certificate、TLS、连接超时 网络连接、企业证书和代理配置 HTTPS 连接成功;不通过关闭证书校验解决

如果错误来自自定义服务地址,保留服务名称这一线索。 第三方服务返回的 401,不能仅靠重新登录 OpenAI 账号解决。

第一步:确认正在用哪个 Codex,以及登录状态

在出错的同一个终端中执行:

codex --version
codex login --help
codex login status

前两个命令用来确认版本和当前版本支持的登录参数;第三个命令检查认证状态,不会启动新的模型任务。

  • 没有有效登录:继续下一节,按你原本打算使用的登录方式登录。
  • 有有效登录,但任务仍报 401:先检查“凭据与配置”一节,不必立刻注销。
  • 命令不存在,或版本与你以为的不一样:先解决安装入口问题。macOS/Linux 可用 command -v codex,PowerShell 可用 Get-Command codex 检查实际执行位置。

如果你在 WSL、Docker 或 SSH 中运行 CLI,这些检查也要在那个环境里执行。宿主机终端登录成功,并不能证明容器或另一台主机也有相同凭据。

第二步:区分 ChatGPT 登录与 API Key 登录

这两种方式对应不同的认证和计费路径。你需要恢复的是原来的路径,而不是为了消除报错随意换一种方式。

使用 ChatGPT 账号登录

codex login

按提示完成浏览器登录,然后回到原终端执行 codex login status。核对浏览器选择的账号与工作区是否就是你想使用的那个。

成功标准: CLI 不再等待登录回调,登录状态能识别认证方式。浏览器中的“成功”页面只是其中一步。

使用 API Key 登录

如果你已经将正确的 OpenAI API Key 放进当前进程的 OPENAI_API_KEY 环境变量,macOS/Linux 可按官方方式通过标准输入登录:

printenv OPENAI_API_KEY | codex login --with-api-key

PowerShell 对应写法:

$env:OPENAI_API_KEY | codex login --with-api-key

变量不存在或值为空时,先在自己的本地环境中配置它。不要把真实密钥直接贴进命令、文章评论或求助截图。

成功标准: 登录状态对应你选择的认证方式。如果随后请求返回额度错误,再核对 API 账户的额度与权限。ChatGPT 订阅和 API 计费的关系可参考Plus、Codex 与 API 区别。

第三步:401 仍然出现,检查凭据与实际配置

按下面顺序核对,每次只纠正一个已经确认的差异,再重复登录状态检查。

  1. 确认配置目录。 检查当前进程是否设置了 CODEX_HOME;未设置时,默认目录通常是 ~/.codex。不同用户、WSL 或容器可能使用不同目录。此处只检查路径,不输出认证文件正文。
  2. 确认凭据保存位置。 官方支持文件和系统凭据存储等方式。没有 auth.json,不一定表示没有登录;使用系统凭据存储时,应通过 codex login status 检查,而不是强行创建该文件。
  3. 确认本次使用的服务配置。 如果使用了配置 profile、自定义 model_provider 或服务地址,检查该服务要求哪一种凭据。向自定义服务发送请求时,默认 OpenAI 登录状态不能证明该服务会接受它。
  4. 确认组织限制。 受管理环境可能限制登录方式或工作区。报错明确指向这些限制时,将脱敏错误交给管理员核对,不自行绕过管理配置。

auth.json 可能包含访问令牌。不要用“把这个文件贴出来看看”的方式排查,也不要直接修改里面的 token 字段。

什么时候才需要注销后重新登录?

当你已经确认登录了错误账号、需要主动切换认证方式,或正确环境中的认证仍持续失败时,可以使用官方注销命令,再按上一节重新登录:

codex logout
codex login

API Key 用户重新登录时使用上一节的 API Key 命令。CLI 与 IDE 扩展可能共享缓存的认证信息,注销后另一个入口也可能需要重新登录。

验证结果: 新登录状态正确,原来失败的最小请求不再返回 401。仅看到登录成功,而未检查原错误是否消失,还不能算修复完成。

token exchange failed:检查浏览器回调与网络

token exchange failed 表示登录流程中的令牌交换没有完成。它本身并没有告诉你是账号、网络还是运行环境的问题,应结合相邻错误和发生步骤判断。

浏览器和 CLI 在同一台机器

重新发起一次登录,使用本次命令给出的链接完成流程,观察错误具体发生在哪一步。如果浏览器已经成功而终端仍在等待,检查本地回调连接是否被代理、端口占用或网络策略影响。

如果同时出现 TLS 或证书错误,应先处理那个明确的网络错误。在公司网络中使用受信任的证书配置,并按官方认证文档的证书说明处理;不要关闭 TLS 验证。

验证结果: 浏览器流程完成后,原终端退出登录等待,登录状态有效。如果仍出现同样的交换错误,记录时间、版本与脱敏错误,不无限重复登录。

CLI 在远程服务器、容器或 WSL 中

浏览器访问的 localhost 与运行 CLI 的环境未必相同。如果常规浏览器回调无法到达 CLI,且账号或工作区允许设备码登录,可使用:

codex login --device-auth

设备码登录在官方资料中标为 beta,需要对应账号安全设置或工作区权限允许。使用自己终端中显示的官方链接完成认证;不要把一次性代码发给其他人。不可用时,查看官方 headless 登录说明中的适用方案,或请工作区管理员确认。

验证结果: 在远程环境内部运行 codex login status 能识别有效登录。不是只在本机浏览器中看到成功。

最后验证:登录状态与实际任务都要通过

先检查状态,再在一个不含敏感资料的测试目录中启动 codex,给它一个明确的只读任务,例如:

只回答 OK,不读取项目文件、不运行命令、不修改文件。

这个步骤会实际使用模型,并可能消耗订阅额度或 API 费用。它验证的是模型请求,不是免费的离线诊断命令。

  • 状态有效、请求成功:认证路径可以工作,再回原项目重试。
  • 状态有效、仍报 401:回查实际服务、配置和凭据匹配关系。
  • 错误变成 403、429 或额度提示:说明下一步要按新的错误原因处理,继续注销通常没有帮助。

仍然失败时,准备哪些信息?

向官方支持、服务提供方或管理员求助时,提供 CLI 版本、系统与运行环境、登录方式、错误发生阶段、可重复步骤、出错时间及脱敏错误文本。近期版本还可参考官方说明中的 codex-login.log 登录诊断日志;路径和支持情况以当前版本为准。

删除密钥、访问令牌、Cookie、认证链接中的敏感参数和工作资料。不要上传完整认证文件。

如果问题涉及路径、依赖或一般权限,继续参考Codex 常见故障排查;登录恢复后需要继续原任务,可查看恢复上次会话的方法。

社区讨论

补充你的经验或问题

评论由 GitHub Discussions 承载;参与讨论需要登录 GitHub。