1. 问题描述

在 WSL 下跳转浏览器登录 Codex CLI 时,每到最后一步,总是出现如下错误:Token exchange failed: token endpoint returned status 403 Forbidden: Country, region, or territory not supported

但是经过检查确认目前已有这些设置:

  • 魔法是开着的,节点很稳定,理论上不受地区限制。
  • WSL 内是设置好了代理 (all_proxy) 的(~/.bashrc 文件内有):代理all_proxy(意思是命令行输入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_proxyhttp_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)TUN 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 ~/.bashrcsource ~/.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 不需要额外权限
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐