
多副本部署下用面板加 OAuth 号必挂:sub2api 的登录会话存在进程内存里,两条请求分到两个节点就回 session not found or expired;本期给出五分钟判据、五个平台各自的表现、以及今晚三条不改代码的绕行办法。
session not found or expired;把两次请求固定到同一节点就能继续。| 平台 | 换码路由 | 失败时客户端看到什么 |
|---|---|---|
| OpenAI | /openai/exchange-code | 400,OPENAI_OAUTH_SESSION_NOT_FOUND,session not found or expired |
| Claude | /accounts/exchange-code(另有 setup token 一对) | session not found or expired,走通用错误映射,落 500 |
| Gemini | /gemini/oauth/exchange-code | 400,Failed to exchange code: session not found or expired |
| Antigravity | /antigravity/oauth/exchange-code | 400,Token 交换失败: session 不存在或已过期 |
| Grok | /grok/oauth/exchange-code | 400,GROK_OAUTH_SESSION_NOT_FOUND;用过一次再换回 ALREADY_USED |
session 不存在或已过期,前面还挂着「Token 交换失败: 」。7
backend/internal/pkg/openai/oauth.go 第 30–56 行(v0.2.19):第 34 行 SessionTTL = 30 * time.Minute,第 53–55 行就是这个结构体,注释原话是 manages OAuth sessions in memory。10
backend/internal/server/routes/admin.go 第 455–462 行(v0.2.19):第 459 行 generate-auth-url、第 460 行 exchange-code,两行各自一个 handler。Gemini、Antigravity、Grok 的换码路由在同文件的第 477、486、496 行,形态一样。11redissession 这个包的注释第一句就是「multi-instance OAuth session backend」,除读写之外还提供单次消费标记。12
backend/internal/service/wire.go 第 19–28 行(v0.2.19):第 24 行 if redisClient != nil,第 25 行把 Grok 的存储换成 Redis 版本;OpenAI、Claude、Gemini、Antigravity 四个服务没有对应分支。14
backend/internal/pkg/xai/oauth.go 第 113–121 行(v0.2.19):第 118 行 redissession.New(rdb, "oauth:session:xai", SessionTTL),key 前缀与 TTL 都在这里定死。要照抄给别的平台,改前缀即可。15/api/v1/admin/openai/* 与另外四个平台的换码前缀,别整个面板都粘。粘整个面板的代价是管理操作全挤到一台机器上。journalctl -u sub2api --since '10 min ago' \
| grep -E "session not found or expired|session 不存在或已过期"ALREADY_USED,那不是同一个病。它是有意的单次消费,第二次换码必然被拒。16session-affinity 只在进程内。那是另一件事。resolved_at 仍是空。17degraded_performance,整站 minor。18| 条目 | 买什么 | 状态 |
|---|---|---|
| #7127 | 给 CLIProxyAPI 加 Kiro 的 AWS SSO 与 Builder ID 登录 | open,零正文,北京 00:59 开 |
| #7079 | AI Studio 通道 400 PROXY_GENERATION_DISABLED | 已关闭(completed),窗口内新评论只是追问,没有新解法 |
xai oauth session Redis write failed。有这条就说明 Redis 没通,那条链路也在按单机跑。15github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.openai.com
status.anthropic.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.