一个用于安全使用多个 Codex 账号的小工具。新版为每个账号分配独立的 CODEX_HOME,让 Codex 在各自目录中持续更新 auth.json,不再把会过期或已撤销的 token 快照来回复制。
旧版工作流是:登录账号 A,复制 ~/.codex/auth.json,退出 A,再登录 B。这里有两个问题:
- Codex 退出登录时会撤销当前 OAuth token。A 的快照可能暂时依靠未过期的 access token 继续工作,但之后无法刷新,最终报
401或refresh_token_reused/refresh_token_invalidated。 - 运行中的 Codex 会缓存账号。直接替换成另一账号的
auth.json时,它会因 account ID 不匹配而拒绝重载。
OpenAI 的 Codex 身份验证文档 说明了登录缓存和自动 token 刷新;auth.json 位于可配置的 CODEX_HOME 下。
chmod +x ./codex-auth-switch
mkdir -p ~/.local/bin
cp ./codex-auth-switch ~/.local/bin/为第一个账号建立独立 profile:
codex-auth-switch login personal浏览器中完成登录后,直接为第二个账号建立 profile:
codex-auth-switch login work不要先运行 codex logout。 两次 login 分别使用两个独立目录,不会为了登录新账号而撤销旧账号的本地会话。
用指定账号启动 Codex CLI:
codex-auth-switch run personal
codex-auth-switch run work也可以传递 Codex 参数:
codex-auth-switch run work -- -C ~/project
codex-auth-switch run personal -- exec "review this repository"在 macOS 上启动 Codex Desktop:
# 先完全退出已运行的 Codex Desktop 和 Codex CLI
codex-auth-switch app personal切换 Desktop 账号时,先退出当前 Codex,再用另一 profile 启动:
codex-auth-switch app work每个隔离 profile 的登录和运行过程都强制使用 file credential store,因此 Codex 刷新后的 token 会回写到对应 profile 的 auth.json。新 profile 会复制当前 config.toml,并共享全局 AGENTS.md、skills、plugins、rules 和 prompts;会话、日志和其他账号状态仍彼此隔离。
app 会直接启动 Codex.app 主程序,使 Desktop 及其 app-server 继承该 profile 的 CODEX_HOME;不使用会丢失启动环境的 open -a。
codex-auth-switch ls
codex-auth-switch rm work --force
codex-auth-switch login work --force # 某 profile 已被服务端撤销时重新登录
codex-auth-switch login work --device-auth # 使用 device-code 登录默认目录:
- 隔离 profile:
~/.codex/auth-profiles/<name>/ - 旧式 profile:
~/.codex/auth-profiles/<name>.json - 备份:
~/.codex/auth-profiles/.backups/
可用 --profiles-dir 和 --codex 自定义路径;这两个全局选项需放在子命令之前。
如果 ls 显示 legacy,请为该名称重新登录:
codex-auth-switch login personal --force成功后,工具会把同名旧 JSON 备份到 .backups/ 并移除。单纯把旧 JSON 移到新目录不能修复已被 logout 撤销的 refresh token,所以迁移必须重新登录。
为了兼容,save/add 和 use/switch 仍可处理旧式 JSON 快照。旧式切换会在检测到 Codex 进程时默认拒绝操作。--allow-running 只是故障排查逃生阀,不能解决账号缓存或 token 撤销问题。
auth.json 和 profiles 都是敏感登录凭据。
- 不要提交到 Git,不要粘贴到 issue 或聊天中。
- 不要同步到不可信网盘。
- 工具将写入的凭据和 profile 配置设为
0600。 rm只删除本地 profile,不会调用 logout 撤销服务端会话。
菜单只从本地 JWT payload 中解析邮箱和 access token 过期时间,不会打印 token。
MIT