Codex 登录失败 token_exchange_failed 怎么办?localhost 回调与 403 排查
登录 Codex 时遇到下面三种情况,看起来都叫「登录失败」,但其实卡在认证链路的不同位置,处理办法也不一样:
- 浏览器显示登录成功,Codex 却提示
token_exchange_failed。 - 浏览器跳到
localhost后打不开。 - 直接出现
403 Forbidden。
本文说的是 OpenAI 官方 Codex 客户端的登录流程(codex login 或客户端里的 Sign in with ChatGPT)。如果你用的是鹊桥这类自定义接口,是用令牌而不是 OAuth 登录,遇到 401/404 请看 大模型 API 常见报错怎么排查。
先搞懂登录流程#
- 运行
codex login,Codex 在本机临时启动一个回调服务。 - 打开官方授权页,你在浏览器里完成账号认证。
- 浏览器把授权结果送回
http://localhost:端口/auth/callback。 - Codex 拿授权码,向官方令牌地址发 POST 请求,换取令牌。
- 把凭据保存到本机。
这解释了两个常见误判:
- 网页能打开 ChatGPT,不代表 Codex 进程能完成第 4 步。 浏览器和 Codex 可能走不同的代理、证书设置。
localhost指的是「浏览器所在的这台机器」,不是 OpenAI 的服务器。Codex 跑在 WSL、SSH、容器或云开发环境里时,这点尤其关键。
按现象找原因#
| 现象 | 说明卡在哪 | 先检查什么 |
|---|---|---|
| 浏览器没打开,或授权页打不开 | 浏览器启动、DNS 或网络 | 手动打开终端里打印的授权地址 |
localhost 拒绝连接或一直转圈 | 授权结果没回到本机回调服务 | 终端窗口是否还开着;浏览器和 Codex 是否在同一台机器 |
token_exchange_failed | 已拿到授权码,换令牌这步失败 | 代理环境变量、证书/HTTPS 检查、客户端版本 |
403 或 access_denied | 服务端拒绝 | 账号、工作区权限、公司策略 |
persist_failed | 换到令牌了,但保存失败 | 配置目录权限、CODEX_HOME |
| 登录成功后发任务报 401 或断流 | 已过了登录阶段 | codex login status、网络和服务状态 |
token_exchange_failed 不等于账号被封。它只是外层提示,里面可能是连接失败、超时、证书校验失败、代理指向失效端口,或返回内容解析失败。先看详细错误,再判断。
第一步:记录现场,别先删配置#
先保存这些信息(不要截图或粘贴带 code=、state= 的回调地址,也别公开令牌和 auth.json):
Codex 版本:
入口:CLI / App / VS Code 扩展
系统:Windows / macOS / Linux / WSL / SSH / 容器
登录方式:浏览器 / 设备码 / API Key
错误码和完整错误正文:
发生时间:
同一账号在别的设备上是否正常:
然后在终端运行:
codex --version
codex login status
新版本还可以用 codex doctor 检查配置、认证存储、代理变量和网络可达性,是否可用看你的版本。
localhost 回调失败怎么办#
情况 A:浏览器和 Codex 在同一台电脑#
- 保持运行
codex login的终端窗口不要关。 - 看终端里实际显示的回调端口,不要凭印象认定必须是某个端口。
- 浏览器没自动弹出,就把终端打印的完整授权地址复制到同一台电脑的浏览器里。
- 关掉以前遗留的登录页,重新跑一次
codex login,只完成最新那一次。 - 终端提示端口被占用时,先退出其他还在跑的 Codex 登录进程。
情况 B:Codex 在 WSL、SSH、容器或云端#
这时浏览器里的 localhost 指向你的本地电脑,而回调服务在远端,两者对不上。较新的 CLI 提供设备码方式:
codex login --device-auth
它会给出一个官方验证地址和一次性代码,适合没有本地浏览器的环境。只输入你自己刚刚发起的那个代码,别用别人发来的。如果你的版本不支持,就改在和浏览器同一台机器上完成登录。
token_exchange_failed 的排查顺序#
从影响面最小的开始:
- 更新 Codex,并彻底退出相关进程再重开。 桌面 App、终端和编辑器扩展都要退出,只刷新网页没用。
- 查代理环境变量是否指向失效端口。 浏览器可能走系统代理,而 Codex 进程读到的是以前遗留的变量。
- Windows PowerShell:
Get-ChildItem Env: | Where-Object Name -Match 'PROXY' - macOS / Linux:
env | grep -iE '^(http|https|all|no)_proxy='
变量里写着
127.0.0.1:某端口,就确认那个端口是否真有你认可的服务在监听。确认已过期,再去系统设置里改掉,并重启所有相关进程。 - Windows PowerShell:
- 查 HTTPS 检查、自定义证书和安全软件。 错误详情里出现证书、TLS、握手失败、未知签发者时,重点看公司网络是否做 HTTPS 检查、安全软件是否替换了证书、系统时间是否正确。可以短时间隔离验证,但不要长期关闭安全软件,让管理员加受控例外才是正路。
- 对比不同机器。 同一账号在另一台电脑正常、只有这台失败,多半是本机的代理、证书、安全软件或版本问题,不是账号问题。
- 查脱敏日志。 较新的 CLI 会在日志目录写
codex-login.log,里面能看到是连接失败、超时还是服务端返回了某个状态码。提交问题前先把账号信息等敏感内容去掉。
403 要分开看#
- 回调就是
access_denied:授权服务拒绝了。看是不是登错了账号,工作区或管理员是否开通了 Codex、是否强制了某种登录方式。 - 令牌地址返回 403:只能确认请求被拒,不能直接推断是封号、没余额或地区问题。重新发起一次全新的登录,别复用旧的回调页;还是不行就保留版本、时间、错误正文和脱敏日志,去官方支持或官方仓库反馈。
- 登录成功后接口才 403:已经不是
token_exchange_failed了,要分清请求发给 ChatGPT Codex、OpenAI API 还是第三方服务,分别核对对应的权限。
什么时候才 logout、清理或重装#
建议顺序:codex login status → 保存诊断 → 更新并重启 → 查代理、证书、时间、安全软件 → 确认是旧凭据或账号切换问题后再:
codex logout
codex login
不要把「删整个 ~/.codex」当首选方案,它会同时丢掉配置和日志。重装也不是第一步,因为用户级代理变量和公司证书不会随卸载消失。
官方登录暂时不通,能直接换 API Key 吗#
可以,但这是另一套身份和账单:API Key 需要 OpenAI 平台项目和独立计费,ChatGPT 订阅不会自动变成 API 余额。命令行建议通过标准输入传入密钥,避免明文留在历史记录里:
printenv OPENAI_API_KEY | codex login --with-api-key
具体参数以 codex login --help 为准。不要把完整密钥发给客服、群友或网页表单。
常见问题#
localhost 打不开是官网宕机了吗?#
通常不是。localhost 是本机的回调地址,先确认 Codex 进程还在运行、浏览器和 Codex 在同一台机器上。
能在浏览器里打开令牌地址来测试吗?#
直接打开是 GET 请求,而真实的令牌交换用的是 POST。看到 405 只说明地址有响应,不能证明登录流程正常。
设备码登录一定能避开这个错误吗?#
不一定。它能避开本地回调问题,但最终仍要访问官方认证和令牌地址,代理或证书的问题照样会让它失败。
网页版 ChatGPT 正常,为什么 App 不行?#
浏览器和 App 的代理来源、证书存储、网络库可能都不同,App 版本本身也可能有问题。网页可用只能缩小范围。