一、问题背景
我想在 VS Code 通过 Remote SSH 连接的服务器上使用 Codex。点击登录后,Codex 给出认证网址;我在本地浏览器完成 OpenAI 账号授权,但扩展最终提示:
Token exchange failed: token endpoint returned status 403 Forbidden一开始我把注意力放在本机代理、Codex 版本等方面,反复检查后才发现:Codex 扩展实际运行在远程 VS Code Server 中,而远程环境没有可用的代理。
二、真正出问题的是哪一段链路
Remote SSH 场景中,需要区分三个位置:
- 本地浏览器:打开登录页,完成人机验证和账号授权。
- 远程 VS Code Server / Codex 扩展:发起登录流程、接收授权结果,并向 OpenAI 的令牌端点兑换 token。
- OpenAI 服务:提供授权和 token 兑换接口。
这次报错中的 Token exchange failed 更准确地表示:Codex 已进入“用授权码兑换 token”的阶段,但运行在服务器上的 Codex 无法正常访问 token endpoint,或者请求被网络出口拦截,因此得到 403。
原先“OpenAI 官网向远程 VS Code 发出回调,但服务器没有代理,所以回调失败”的说法不够准确。OAuth 回调和后续 token 兑换是两个环节;如果明确报错来自 token endpoint,应优先检查远程 Codex 进程的出站网络,而不能只检查浏览器能否打开登录页。
三、配置 SSH 反向端口转发
1. 确认本地代理端口
先确认代理软件已启动,并确定它提供的代理协议和监听端口。下面以本机 HTTP 代理 127.0.0.1:7890 为例。
需要注意:
http://127.0.0.1:7890必须真的是 HTTP 代理端口;如果是 SOCKS5 端口,应使用socks5://,且还要确认 VS Code/Codex 对该配置的支持。127.0.0.1指的是本机,不要填成本机的公网 IP。- 若代理软件有“允许局域网连接”选项,本方案通常不需要开启,因为 SSH 客户端访问的是本机回环地址。
2. 修改本地 SSH 配置
在本地电脑打开 SSH 配置文件:
- Windows:
C:\Users\<用户名>\.ssh\config - Linux / macOS:
~/.ssh/config
在目标服务器对应的 Host 段中加入:
Host my-server HostName 服务器地址 User 用户名 RemoteForward 7890 127.0.0.1:7890 ExitOnForwardFailure yesRemoteForward 7890 127.0.0.1:7890 的含义是:在服务器侧监听 7890端口,将连接通过 SSH 隧道转发到本机的 127.0.0.1:7890。
注意:理论上此处服务端端口可以与本地端口不同,但最好保持一致不会出错。
ExitOnForwardFailure yes 可以让端口转发创建失败时立即报错,避免 SSH 看似连接成功、实际却没有代理通道。
修改后,需要断开并重新建立 Remote SSH 连接,已有 SSH 会话不会自动应用新配置。
四、在远程 VS Code 中设置代理
打开一个已经连接到远程服务器的 VS Code 窗口,进入组件商店,找到安装的ssh扩展,然后进入设置。确认当前编辑的是 远程 [SSH: my-server] 设置,而不是本地用户设置。
搜索 proxy,将 Http: Proxy 设置为:
http://127.0.0.1:7890也可以在远程设置的 settings.json 中加入:
{ "http.proxy": "http://127.0.0.1:7890"}

不要为了绕过问题而关闭 TLS 校验,例如不要设置 "http.proxyStrictSSL": false。如果单位网络使用自签名证书,应正确安装其 CA 证书。
配置完成后,执行 Developer: Reload Window,必要时重新连接远程主机,再尝试登录 Codex。
五、验证代理链路
先不要急着反复登录,可以在 VS Code 的远程终端中验证隧道。以下命令只用于确认代理是否可达,不代表业务接口一定会返回 200:
curl -I --proxy http://127.0.0.1:7890 https://auth.openai.com/ss -lnt | grep 7890六、这次排查中的几个误区
1. 本地浏览器能登录,不等于远程 Codex 能联网
浏览器运行在本地,而 Codex 扩展运行在远程服务器。两者的网络出口不是同一个环境,本地代理不会自动传给远程 VS Code Server。
2. 403 不一定是账号或 Codex 版本问题
403 也可能来自代理、网关、地区或组织策略。结合 token endpoint 和 Remote SSH 场景,应先验证远程端到认证服务的完整链路,再排查版本和账号权限。
3. 不是“本地和服务端分别设置两条 SSH 转发”
本方案只在本地 SSH 客户端的配置中声明一次 RemoteForward。SSH 建立连接后,会在服务器侧创建监听端口。服务端需要做的是让远程 VS Code/Codex 使用这个端口作为代理,而不是再写一条 SSH 转发配置。
4. VS Code 的 http.proxy 不一定覆盖所有远程命令
它主要影响 VS Code 及遵循该设置的扩展。如果还要让远程 shell 中的 curl、包管理器或 Codex CLI 使用代理,需要在对应进程的环境中单独设置 HTTP_PROXY、HTTPS_PROXY 等变量。不要把代理变量和凭据写进会提交到 Git 的项目文件。
七、总结
这次问题的关键不是“本地是否能打开 OpenAI 登录页”,而是先确认 Codex 究竟运行在哪里。在 VS Code Remote SSH 场景中,扩展的认证和 API 请求可能由远程 VS Code Server 发起,因此远程端也必须具备可用的出站网络。
通过 SSH RemoteForward,可以把服务器上的代理端口安全地转回本机代理,再把远程 VS Code 的 http.proxy 指向该端口。链路打通后,Codex 才能完成 token 兑换和后续请求。
参考资料
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时


