1684 字
8 分钟
OpenCode 登录 OpenAI 时,浏览器授权成功了,为什么 provider 还是不出现?

这次踩坑其实挺迷惑人的。

我在 OpenCode 里尝试登录 OpenAI 账号时,整个流程表面上看起来都像是成功的:浏览器里授权完成了,终端里也收到了回调,按直觉来说,下一步就应该是在 provider 列表里看到 OpenAI 出现。

但现实是,它就是没有出现。

这种问题最容易把人往两个方向带偏:

  • 是不是 OpenCode 的界面没有刷新
  • 是不是登录虽然看起来成功了,其实本地根本没记住

我一开始也在这两个方向里打转,但后面回头看,真正的问题其实不在“显示层”,而在授权完成后的最后一跳网络请求

表面现象为什么这么像“已经成功了”#

这个问题最容易误导人的地方,就是前半段流程太正常了。

我当时看到的是:

  • OpenCode 能正常拉起浏览器授权页
  • 浏览器里 OpenAI 登录和授权都能完成
  • 回到终端后,也能看到本地回调已经发生

如果只看这几步,几乎很难不相信“登录已经结束了”。

但后来我才意识到:浏览器授权成功,不等于整个 CLI 登录流程已经完整成功。

原因是 OAuth 这类流程通常不只是一句“浏览器点完确认就结束”。浏览器完成授权之后,CLI 往往还要继续做一件关键的事:

  • 拿着回调带回来的信息
  • 再向服务端发起一次 token exchange
  • 把最终拿到的令牌写回本地状态文件

如果这一步失败,前面再顺也没用。

真正的线索,不在页面,而在本地状态和错误信息#

后来继续排查时,两个现象开始把问题指向同一个地方。

第一,OpenCode 里 provider 没有出现。

第二,本地认证状态文件里也没有 OpenAI 条目。

我当时检查到的情况是,~/.local/share/opencode/auth.json 里只有 GitHub Copilot 的记录,没有 OpenAI。这个现象很关键,因为它基本说明:

  • 不是单纯 UI 没刷新
  • 而是 OpenCode 根本没有把 OpenAI 这次登录结果成功落盘

继续往下看日志后,真正的报错也出来了:

Token exchange failed: 403

到这里,问题的性质就变了。

它已经不是“OpenCode 有没有识别到 provider”的问题,而是OpenCode 在授权回调之后,继续向 OpenAI 服务端换取 token 的那一步失败了

根因不是账号没登上,而是代理环境变量没配完整#

最后把整个链路串起来之后,根因其实非常具体:

我当时的终端环境里,只设置了 ALL_PROXY,但没有单独设置 HTTP_PROXYHTTPS_PROXY

这件事之所以坑,是因为它会制造一种很强的错觉:

  • 浏览器本身能打开授权页
  • 某些请求看起来也能走代理
  • 但 CLI 进程里真正负责后续联网的那部分请求,不一定会按你想象的方式使用 ALL_PROXY

也就是说,前半段浏览器授权能成功,并不能证明 OpenCode 后续那次 token exchange 也一定成功。

对很多命令行工具来说,尤其是 OAuth 这种“浏览器授权 + 本地回调 + 服务端换 token”的流程,HTTP_PROXYHTTPS_PROXY 往往才是更关键、更稳定的代理入口。

我这里最终就是卡在这一步:

  • 浏览器能打开
  • 回调能回来
  • 但 token exchange 没有正确走代理
  • 最终返回 403
  • 所以本地没有写入 OpenAI 认证状态
  • provider 列表里自然也不会出现 OpenAI

这个问题为什么容易被误判成 UI 刷新问题#

回头看,这类问题真的很容易被误判成“界面没更新”。

因为从用户视角看,最直观的现象只有一个:

我明明都登录成功了,为什么界面里还是没有。

但这里面有一个很重要的排障思路:

不要只盯着 UI,要先确认状态有没有真的写进去#

如果只是 UI 没刷新,那么底层状态通常已经是成功的。

也就是说,至少应该能看到:

  • 本地认证文件里出现新的 provider 条目
  • 或者重启客户端后能恢复显示

但如果底层状态文件里压根没有对应 provider,那就不要继续纠结“界面显示”了,应该直接查后端请求、日志和网络链路。

我最后是怎么修好的#

修复方式其实不复杂,关键是把代理变量补完整。

除了已有的 ALL_PROXY,还需要把 HTTP_PROXYHTTPS_PROXY 一并设置好,让 OpenCode 在后续联网时明确走代理。

例如:

Terminal window
export ALL_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890

如果你用的是 socks 代理,就按你实际代理类型替换,但核心思路不变:

  • 不要只配 ALL_PROXY
  • HTTP_PROXYHTTPS_PROXY 也补齐

补完之后,再重新走一次 OpenCode 的登录流程,问题就能闭环了。

如果你也遇到同样现象,我建议按这个顺序查#

如果你现在遇到的是:

  • 浏览器授权成功
  • 终端回调成功
  • 但 provider 还是不出现

我会建议优先按下面这个顺序排查:

1. 先看本地认证状态有没有写进去#

重点看 ~/.local/share/opencode/auth.json 里是否真的出现了 OpenAI 条目。

如果没有,就先别把锅甩给 UI。

2. 再看有没有 token exchange 相关错误#

如果日志里能看到类似:

Token exchange failed: 403

那基本就可以把问题定位到授权后的服务端换 token 阶段了。

3. 优先检查代理变量,而不是只检查浏览器能不能开页面#

浏览器能打开授权页,只能说明“浏览器这一段”没问题。

真正要确认的是:OpenCode 这个 CLI 进程后续联网时,是否也正确使用了代理。

尤其要检查:

  • HTTP_PROXY
  • HTTPS_PROXY
  • ALL_PROXY

这几个值是否一致,是否真的指向当前可用的代理端口。

这次排查给我的一个提醒#

这次问题最后其实不是 OpenAI 登录失败,也不是 OpenCode 单纯没刷新,而是一个很典型的 CLI 网络环境问题。

如果要把这次经验总结成一句话,我会写成:

网页登录成功 + 本地回调成功,并不代表命令行工具后续的 token exchange 也一定成功。

尤其是涉及 OAuth 的 CLI 工具时,只设置 ALL_PROXY 不一定够。很多时候,补齐 HTTP_PROXYHTTPS_PROXY,才是把整条链路真正打通的关键一步。

OpenCode 登录 OpenAI 时,浏览器授权成功了,为什么 provider 还是不出现?
https://blog.yangyus8.top/posts/20260320-01/
作者
杨与S8
发布于
2026-03-20
许可协议
CC BY-NC-SA 4.0