前言

你是不是也遇到过这样的尴尬场景:在 WSL 里兴致勃勃地安装了 OpenAI Codex,结果一运行 codex 命令就卡住,要么让你登录浏览器,要么直接报 403 错误?

别慌,这篇文章帮你彻底解决这个问题。


问题现象

先看看你是不是也遇到了这些情况:

场景一:无限登录循环

# 在 WSL 中执行
codex login
# 浏览器打开了,登录成功
# 回到终端继续报错,让你再次登录

场景二:403 Forbidden

codex whoami
# Token endpoint returned status 403: Forbidden

场景三:浏览器无法打开

codex
# Error: Failed to open browser

如果你中招了任何一个,继续往下看。


问题根源:WSL 和 Windows 的 localhost 隔离

要解决问题,先得明白为什么会这样。

WSL2 的网络架构

WSL2 采用了轻量级虚拟机技术,它有自己独立的网络栈。这意味着:

  • Windows 的 localhost127.0.0.1(指向 Windows 系统)
  • WSL 的 localhost127.0.0.1(指向 WSL 虚拟机内部)

这两个 localhost 是完全隔离的,互不相通。

OAuth 登录流程的问题

OpenAI Codex 使用 OAuth 2.0 协议登录:

  1. 你在 WSL 终端执行 codex login
  2. Codex 尝试打开浏览器,访问 http://localhost:端口号
  3. 浏览器完成登录后,OAuth 回调会返回到同一个 localhost 地址
  4. 问题来了:WSL 启动的浏览器(如果有的话)无法回调到 WSL 内部的 localhost

为什么 Windows 可以正常登录?

在 Windows 上直接执行 codex login 没问题,因为:

  • Windows 有完整的桌面环境
  • 浏览器和 Codex CLI 运行在同一个系统内
  • localhost 回调正常工作

但在 WSL 里:

  • 没有原生桌面环境
  • 即使能调用 Windows 浏览器,localhost 也指向不同的网络空间
  • OAuth 回调失败,token 无法正确保存


解决方案:复制 Windows 登录态到 WSL

既然 WSL 无法完成 OAuth 流程,那我们就在 Windows 端完成登录,然后把登录态复制到 WSL。

方案优势

  • 一次登录,处处可用
  • 不破坏 WSL 环境隔离
  • root 用户也能正常使用
  • 支持多个 WSL 发行版

完整解决步骤

第一步:在 Windows 端完成登录

打开 Windows PowerShell 或 CMD,执行:

codex login

系统会自动打开浏览器,完成登录授权即可。

登录成功后,你的凭证会被保存到:

C:\Users\<你的Windows用户名>\.codex

验证一下是否成功:

codex whoami

如果能正常显示你的用户信息,说明 Windows 端登录成功。


第二步:确认 Windows 登录态目录

在 Windows 文件资源管理器中,确认以下目录存在:

C:\Users\<你的Windows用户名>\.codex

里面应该包含类似这样的文件:

  • config.json
  • session.json
  • token 或其他凭证文件


第三步:复制登录态到 WSL

在 WSL 中执行复制(适用于所有用户)

WSL 终端中执行:

# 1. 确保当前用户的 codex 目录存在
mkdir -p ~/.codex

# 2. 从 Windows 拷贝登录态(记得替换你的 Windows 用户名)
cp -r /mnt/c/Users/<你的Windows用户名>/.codex/* ~/.codex/

# 3. 修改权限
chmod -R 700 ~/.codex

说明

  • ~ 符号代表当前用户的 HOME 目录
  • 如果你是 root 用户,它会自动展开为 /root
  • 如果你是普通用户,它会自动展开为 /home/<你的用户名>


第四步:验证是否生效

WSL 终端中执行:

codex whoami

或者直接:

codex

成功标志

  • 不再弹出浏览器登录窗口
  • 不再报 403 错误
  • 正常显示 Codex 命令行界面


为什么这个方案有效

原理解析

  1. Codex 只认凭证文件

    • Codex CLI 在启动时,只检查当前用户 HOME 目录下的 .codex 文件夹
    • 对于 root 用户,就是 /root/.codex
    • 对于普通用户,就是 /home/<用户名>/.codex
  2. 凭证文件是跨平台的

    • Codex 的 token 文件不绑定操作系统
    • 不绑定 UID(用户 ID)
    • 不校验登录发生的环境
    • 只是一个纯文本的认证凭证
  3. WSL 可以直接访问 Windows 文件系统

    • Windows 的 C 盘被挂载到 /mnt/c/
    • 可以直接复制文件,无需额外工具

进阶技巧:创建符号链接(可选)

如果你经常在 WSL 和 Windows 之间切换,可以创建符号链接,让 WSL 直接使用 Windows 的登录态:

# 备份现有配置(如果存在)
[ -d ~/.codex ] && mv ~/.codex ~/.codex.bak

# 创建符号链接
ln -s /mnt/c/Users/<你的Windows用户名>/.codex ~/.codex

优点

  • Windows 端重新登录后,WSL 自动同步
  • 节省磁盘空间
  • 统一管理登录态

缺点

  • 符号链接在某些工具中可能有兼容性问题
  • 删除 WSL 发行版时可能误删 Windows 配置

建议:对于大多数用户,直接复制文件更稳妥。


常见踩坑提醒

❌ 不要在 WSL 里重复登录

错误做法:

# Windows 端已经登录了
codex login

# 又在 WSL 里执行
codex login  # 会再次触发 OAuth,问题重现

正确做法

  • Windows 端登录一次
  • 复制凭证到 WSL
  • WSL 里不要再执行 codex login

⚠️ 注意多用户环境

如果你在 WSL 中同时使用 root 和普通用户:

# root 用户
/root/.codex

# 普通用户(如 ubuntu)
/home/ubuntu/.codex

这两个目录是独立的,需要分别复制 Windows 的登录态。


🚨 避免多目录混乱

确保只有一个 .codex 目录在起作用:

# 检查是否有多个配置
find ~ -name ".codex" -type d

# 如果有多个,删除不需要的

对于 root 用户,只认:

/root/.codex

多个 WSL 发行版怎么办

如果你有多个 WSL 发行版(Ubuntu、Debian、Arch 等),每个都需要单独复制:

# Ubuntu
cp -r /mnt/c/Users/<你的Windows用户名>/.codex/* /home/ubuntu/.codex/

# Debian
cp -r /mnt/c/Users/<你的Windows用户名>/.codex/* /home/debian/.codex/

# Arch Linux
cp -r /mnt/c/Users/<你的Windows用户名>/.codex/* /home/arch/.codex/

或者在每个发行版里创建符号链接:

ln -s /mnt/c/Users/<你的Windows用户名>/.codex ~/.codex

效果对比

场景 问题解决前 问题解决后
执行 codex 命令 弹浏览器登录或报 403 直接进入命令行界面
执行 codex whoami Token endpoint returned status 403 正常显示用户信息
开发体验 每次都要折腾登录 一次配置,永久生效

总结

这个问题本质上是 WSL 网络隔离 导致的 OAuth 流程无法完成。通过在 Windows 端完成登录,然后复制凭证到 WSL,可以绕过这个问题。

核心要点:

  1. 理解问题根源:WSL 和 Windows 的 localhost 是隔离的
  2. 选择正确方案:Windows 登录 → 复制凭证到 WSL
  3. 注意细节:不同用户(root/普通)需要分别配置
  4. 避免踩坑:不要在 WSL 里重复登录

希望这篇文章帮你彻底解决了 WSL 环境下 Codex 的登录问题。如果你有其他问题或更好的解决方案,欢迎在评论区交流。


参考资源

  • Microsoft WSL 官方网络文档:
    https://learn.microsoft.com/en-us/windows/wsl/networking

  • Lanmojun - WSL下安装codex提示Token exchange failed:
    https://lanmojun.com/archives/wslxia-an-zhuang-codexti-shi-token-exchange-failed-token-endpoint-returned-status-403-forbidden

  • Linux.do - WSL环境下如何解决codex无法登录问题:
    https://linux.do/t/topic/856958

  • CNBlogs - 在wsl中安装codex报错403:
    https://www.cnblogs.com/Fish0403/p/19109229


欢迎关注公众号 FishTech Notes,一块交流使用心得!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐