Skip to content

Instantly share code, notes, and snippets.

@pengx17
Created August 12, 2026 10:09
Show Gist options
  • Select an option

  • Save pengx17/c7462ad33b5ccbb72f1a59317bd91c9c to your computer and use it in GitHub Desktop.

Select an option

Save pengx17/c7462ad33b5ccbb72f1a59317bd91c9c to your computer and use it in GitHub Desktop.
Fix ChatGPT/Codex Slack connector stuck in an OAuth reauthentication loop

修复 ChatGPT / Codex 的 Slack Connector 反复要求重新认证

适用症状:Slack 工具持续提示重新认证,错误原因为 oauth_refresh_token_rejected;重启应用、重开任务或普通 Reconnect 后仍然失败。

本文来自一次 2026-07-29 的 macOS 实际排查。ChatGPT 的界面名称可能变化, 但判断方法和恢复原则不依赖具体菜单文案。

先说结论

这通常不是某个聊天 session 自然过期,而是 ChatGPT / Codex 仍在使用一条失效的 Slack connection。每条 connection 在工具元数据中表现为一个不透明的 link_id; 真正的 OAuth token 不在本地工具缓存里。

有效修复不是反复重启 session,而是:

  1. ChatGPT 网页端确认登录的是与 Codex 相同的 ChatGPT 账号;
  2. 打开 Plugins → Slack(界面名称若变化,就在 Plugin Directory 搜索 Slack);
  3. 真正删除或断开现有 Slack connection,再重新 Connect 并完成 OAuth;
  4. 用只读 Slack 调用验证;
  5. 如果能检查工具元数据,确认 Slack 的 link_id 已换成新值。

症状确认

先做一次不会写入 Slack 的只读探针,例如列出 workspace:

slack_list_workspaces

若结果包含:

oauth_refresh_token_rejected

记录以下脱敏信息:

  • 失败时间;
  • 错误 reason;
  • connector_id 的短前缀;
  • link_id 的短前缀;
  • 最近一次成功调用使用的 link_id 是否不同。

不要记录或分享 access token、refresh token、邮箱、workspace 私密内容或完整账号 ID。

修复步骤

1. 暂停自动重试

若有 heartbeat、scheduled task 或轮询在调用 Slack,先暂停。重复调用同一坏连接只会 制造噪声,不会刷新 OAuth 状态。

2. 在正确的 ChatGPT 账号下管理 Slack

打开 ChatGPT 网页端,确认当前账号与 Codex 使用的账号一致。账号切换后,旧任务、 当前 UI 和服务端 connected account 可能暂时处在不同上下文。

进入 Plugins → Slack。不要把下面这些操作当成等价修复:

  • 只刷新页面;
  • 只重启 Codex;
  • 只新建聊天或任务;
  • 只重新登录 Slack 网页;
  • 只点击一个没有替换 connection 的 Reconnect。

3. 删除旧 connection,再重新连接

在 Slack 插件管理页执行完整的 Disconnect / Delete,然后重新 Connect,并完成 Slack OAuth 授权。目标是让 ChatGPT 服务端建立一条新的 connected-account 记录,而不只是 继续复用旧记录。

这个操作会改变 ChatGPT 中的 Slack 连接状态,但不会删除 Slack 消息或退出 Slack workspace。

4. 做只读验证

重新运行:

slack_list_workspaces

成功标准:

  • 能返回预期 workspace;
  • 不再出现 oauth_refresh_token_rejected
  • 如果可检查连接元数据,link_id 已从旧值变成新值。

不要通过“发送一条测试消息”验证认证;读操作已经足够。

5. 逐个恢复旧任务

不需要先批量重启所有 session。让每个需要 Slack 的旧任务各运行一次只读探针:

  1. 成功:继续使用原任务;
  2. 仍失败:完整重启 ChatGPT / Codex 后再试一次;
  3. 仍命中同一坏 link_id:停止继续创建任务或重复 OAuth,进入升级路径;
  4. 只有探针成功后,才恢复暂停的自动化。

为什么清本地缓存通常不是最终修复

Codex 可能把 App / Tool discovery 元数据缓存在本机。缓存中可以包含 link_id,但不 包含真正的 Slack refresh token。

一次真实案例中,即使把 discovery cache 可回滚地移走并完整重启,Codex 重新从 OpenAI 服务端获取工具列表后,仍然拿回同一个坏 link_id。这说明:

本地缓存清空
→ 服务端 tools/list 再次返回坏 link
→ 新缓存仍然包含坏 link
→ Slack 调用继续失败

因此不要把删缓存作为第一步,更不要无备份地删除整个 ~/.codex。清缓存最多是用于 区分“本地陈旧元数据”和“服务端仍下发坏 connection”的诊断步骤。

仍然失败时

若完整 Delete / Disconnect → Connect 后,工具仍命中同一个坏 link_id

  1. 停止要求用户反复登录、重启或新建 session;
  2. 保存脱敏时间线:最后成功时间、首次失败时间、错误 reason、旧/新 link_id 前缀;
  3. 注明是否已验证新任务、完整重启和真正删除后重连;
  4. 向 OpenAI Support 或 openai/codex 提交 connected-account / connector-link mapping 故障报告。

这时更可能是服务端仍把当前 ChatGPT 账号映射到失效的 Slack connection,而不是本地 session 的问题。

一页版 Runbook

只读 probe
  ├─ 成功 → 无需处理
  └─ oauth_refresh_token_rejected
       ↓
暂停自动重试
       ↓
确认 ChatGPT 与 Codex 是同一账号
       ↓
Plugins → Slack → Delete/Disconnect → Connect
       ↓
再次只读 probe
  ├─ 成功且 link 已变化 → 逐个恢复旧任务与自动化
  └─ 仍是同一坏 link → 停止本地折腾,整理证据并升级

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment