AI Auth Converter 说明文档
这个页面记录项目的转换边界、字段映射和维护入口,方便后续修改时先看清楚现有逻辑。
项目定位
本项目是纯前端 JSON 转换工具,所有解析和转换都在浏览器本地完成。页面不上传 token,不写入浏览器存储。
当前只保留三个输出格式:CPA、sub2api、Codex。
支持输入
| 输入来源 | 识别字段 | 平台类型 |
|---|---|---|
| ChatGPT Web session | accessToken、sessionToken、user.email、account.id |
codex |
| Codex auth.json | tokens.access_token、tokens.refresh_token、tokens.id_token、tokens.account_id |
codex |
| xAI/Grok OAuth auth.json | key、refresh_token、expires_at、oidc_issuer: "https://auth.x.ai" |
xai |
| CPA JSON | type: "codex" 或 type: "xai",以及对应 token 字段 |
按 type 自动识别 |
输出规则
CPA
CPA 会自动识别平台:
- ChatGPT/Codex 输入输出
type: "codex"。 - xAI/Grok OAuth 输入输出
type: "xai"。 - xAI/Grok 输入没有
id_token时,输出id_token: "",不合成 id token。 - xAI/Grok 输入带真实
refresh_token时,不写expired/expires_in;缺少refresh_token时才补过期字段。
sub2api
输出 exported_at/proxies/accounts 结构。账号对象的 expires_at 优先来自 access token JWT 的 exp,但带 refresh_token 的账号会省略 access-token 过期暂停字段。
Codex
只支持 codex 平台输入,输出原生 Codex auth.json:
{
"auth_mode": "chatgpt",
"OPENAI_API_KEY": null,
"tokens": {
"id_token": "...",
"access_token": "...",
"refresh_token": "...",
"account_id": "..."
},
"last_refresh": "..."
}
xAI/Grok OAuth 不能转换成 Codex,因为它属于不同认证平台。选择 Codex 输出时,xAI/Grok 账号会被跳过;如果输入里只有 xAI/Grok,会显示错误提示。
预览表字段
| 列名 | 含义 |
|---|---|
| 平台 | codex 或 xai,用于避免混合账号时看不出来源。 |
| 名称 | 优先取输入里的 name、label、meta.label。没有独立名称时,Codex 显示 Codex Account,xAI 显示 xAI/Grok Account。 |
| 邮箱 | 来自输入字段或 token payload;如果 xAI token 没有邮箱,则使用 OAuth 记录里的 email。 |
| 过期时间 | 用于预览。xAI 带 refresh_token 时,CPA 输出不写过期字段,但预览仍可显示 OAuth 记录里的 expires_at。 |
主要代码入口
collectSessionLikeObjects:递归扫描拖入或粘贴的 JSON,找出可转换账号。isXaiOAuthRecord:判断对象是否是 xAI/Grok OAuth。convertSession:核心转换函数,同时生成 CPA、sub2api、Codex 输出对象。buildOutputDocument:按当前选中的输出格式组装最终 JSON。readFiles:处理选择文件和拖拽文件。
测试
测试文件位于 tests/convert-session.test.js。本地验证命令:
node tests/convert-session.test.js
Cloudflare Workers 部署
项目使用 Workers Static Assets 部署 docs/ 目录。部署配置在 wrangler.jsonc,Worker 入口在 src/index.js。
npm install
npm run deploy
生产域名:ai-auth-convert.bbb0t.com。