WSL 下 Codex CLI 登录出现 Token Exchage Failed 问题解决方案
文章目录
1. 问题描述
在 WSL 下跳转浏览器登录 Codex CLI 时,每到最后一步,总是出现如下错误:Token exchange failed: token endpoint returned status 403 Forbidden: Country, region, or territory not supported
但是经过检查确认目前已有这些设置:
- 魔法是开着的,节点很稳定,理论上不受地区限制。
- WSL 内是设置好了代理 (
all_proxy) 的(~/.bashrc 文件内有):
(意思是命令行输入proxy即执行export all_proxy=http://172.27.160.1:7890。这里7890是魔法映射的端口。)
使用curl https://api.ipify.org输出的 IP 地址确认是魔法节点的 IP 地址(可用 IP 地址查询网站验证)。 - 网上搜索的方法包含开启TUN Mode、关闭IPv6,但尝试后没用。
- 还有的解决方案是在 Windows 主机上用浏览器登录 Codex 后找到:
C:\Users\<用户名>\.codex\auth.json。然后复制到 WSL 下的~/.codex/中,并chmod 600 ~/.codex/auth.json,这样 WSL CLI 可以直接使用。由于不想再下一遍 Codex 所以没有尝试这个方案。
跟 GPT 聊了几轮后,最终成功解决了这个问题,首先这是它给的问题原因分析。
2. 问题原因分析
2.1 WSL 本地回调被代理干扰
- Codex 在网页登录的最后一步 OAuth 流程需要在 WSL 内启动本地回调(
http://localhost:1455) - 手动设置的
all_proxy或http_proxy会让本地回调请求走代理 - 代理拦截后导致 CLI 无法接收到 OAuth token,最终报
token exchange failed
2.2 CLI / OAuth 请求裸连导致风控
- 部分版本的 Codex CLI 在 token exchange 阶段不一定遵循代理环境变量
- OAuth 请求可能直接裸连 OpenAI
auth服务器 - 如果出口 IP 或请求行为被 Cloudflare 判定异常,返回 403
2.3 WSL ↔ Windows localhost 映射差异
- WSL2 内部网络和 Windows localhost 端口映射存在差异
- 浏览器访问
localhost:1455回调可能失败 - 导致不同用户在相似环境下出现“有人顺利有人失败”的情况
3. 解决方案
3.1 安装 Service Mode(必须)
首先需要点击Manage下载服务模式(Service Mode)
以允许 Clash 在 Windows 上创建虚拟网卡,修改路由表
3.2 开启 TUN Mode
这样 WSL 的所有流量透明走 Clash 节点
3.3 关闭 WSL 内手动代理
unset all_proxy
unset http_proxy
unset https_proxy
3.4 设置 NO_PROXY 确保 localhost 回调畅通
export NO_PROXY=localhost,127.0.0.1,::1
3.5 重新登录 Codex CLI
codex logout
codex login
3.6 登录完成后恢复代理
proxy # 前图所示的 alias proxy='export all_proxy=http://172.27.160.1:7890' 语句已在 .bashrc 中定义
也就是执行了export all_proxy=http://172.27.160.1:7890。
登录完成后,Codex CLI 已缓存 token,后续登录就不再受代理状态影响了。
4. 解决方案的自动化脚本
alias proxy='export all_proxy=http://172.27.160.1:7890'
alias unproxy='unset all_proxy'
codex_auto_login() {
echo "🚀 开始 Codex 登录流程..."
OLD_ALL_PROXY=$ALL_PROXY
OLD_HTTP_PROXY=$HTTP_PROXY
OLD_HTTPS_PROXY=$HTTPS_PROXY
unset ALL_PROXY all_proxy
unset HTTP_PROXY http_proxy
unset HTTPS_PROXY https_proxy
export NO_PROXY=localhost,127.0.0.1,::1
codex logout
codex login
if [ -n "$OLD_ALL_PROXY" ]; then export ALL_PROXY=$OLD_ALL_PROXY; fi
if [ -n "$OLD_HTTP_PROXY" ]; then export HTTP_PROXY=$OLD_HTTP_PROXY; fi
if [ -n "$OLD_HTTPS_PROXY" ]; then export HTTPS_PROXY=$OLD_HTTPS_PROXY; fi
if command -v proxy >/dev/null 2>&1; then proxy; fi
echo "✅ Codex 登录完成,代理已恢复。"
}
将其加入 .bashrc 或 .zshrc,输入source ~/.bashrc或source ~/.zshrc。每次登录就只需打开TUN Mode,然后执行 codex_auto_login即可。成功登录后可再次运行curl https://api.ipify.org 确认 proxy 是否执行,即 Codex CLI 登录成功后,WSL 有没有重新走设置的all_proxy代理地址。
也可以根据自行需求选择一直开着 TUN Mode,就不用恢复原来的 proxy 设置了。
4. 补充 —— 开启TUN Mode vs 不开启TUN Mode
| 功能 | 开启 TUN Mode | 不开启 TUN Mode |
|---|---|---|
| WSL 流量 | 透明走 Clash 节点(包括 Codex CLI OAuth、apt、curl、npm 等) | 仅依赖环境变量代理(all_proxy / http_proxy),部分程序可能不走代理 |
| 本地回调访问 | OAuth token exchange 更可靠,不易被风控阻挡 | WSL 内 OAuth 回调可能被拦截或裸连,导致 403 / token exchange failed |
| Windows + WSL 网络整合 | 更稳定,整个系统流量都可被管理 | 需要手动设置代理,每次登录或程序可能失效 |
| 额外权限 | 需要安装 Service Mode | 不需要额外权限 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)