本文档介绍 Metapi 里的「OAuth 管理」页面,适合需要直接授权 provider 账号的场景。
不是所有上游都适合手填 API Key、Access Token 或 Cookie。
对下面这类 provider 账号,更推荐直接走 OAuth:
- Codex
- Claude
- Gemini CLI
- Antigravity
这类接法的特点是:
- 使用浏览器授权,而不是手填用户名密码
- 授权成功后,Metapi 会自动创建或复用对应 provider 的站点
- 账号会按 OAuth 连接保存,后续刷新和重绑也走同一套流程
如果你接的是 New API、One API、Sub2API、CPA、OpenAI-compatible、Claude-compatible 这类普通站点或网关,请看 上游接入。
管理后台左侧菜单已经有独立入口:
OAuth 管理
这不是站点编辑器里的一个隐藏选项,而是和「站点管理」「账号管理」并列的一页。
| Provider | 对应平台 | 自动创建的站点名 | 典型用途 |
|---|---|---|---|
| Codex | codex |
ChatGPT Codex OAuth |
直接用 Codex 账号授权 |
| Claude | claude |
Anthropic Claude OAuth |
直接用 Claude / Anthropic 账号授权 |
| Gemini CLI | gemini-cli |
Google Gemini CLI OAuth |
复用 Gemini CLI / Google Cloud 账号授权,可选输入 Project ID |
| Antigravity | antigravity |
Google Antigravity OAuth |
复用 Antigravity 账号授权 |
授权完成后,这些站点会出现在「站点管理」里,但通常不建议你手动创建它们。
如果你的部署环境访问外网受限,可以:
- 先配置全局
SYSTEM_PROXY_URL - 或在 OAuth 启动 / 重绑时使用单次代理参数
相关环境变量见 配置说明 里的「OAuth 与 Provider 登录」一节。
OAuth 默认使用 Metapi 本机上的 loopback 回调地址,例如本机 127.0.0.1 端口。
如果你的 Metapi 跑在远程服务器上,而浏览器跑在本地电脑上,常见做法有两个:
- SSH 隧道:按页面给出的命令,把回调端口转发到远端
- 手动回填 callback URL:如果浏览器已经完成授权,但自动回调没打通,可把最终回调地址手动贴回管理页
OAuth 连接更适合“provider 原生账号授权”,而不是:
- 面板站点账号密码登录
- New API / One API 后台管理
- CPA / OpenAI-compatible 的普通 API Key 托管
进入左侧菜单「OAuth 管理」,等待页面加载 provider 列表和已有连接。
页面会为 provider 发起一个 OAuth 会话,并弹出授权窗口。
Metapi 会同时给出:
- 授权链接
- 本机回调端口
- 手动回填等待时间
- 如果当前是远程访问,还会给出 SSH 隧道命令模板
完成授权后,Metapi 会轮询当前会话状态:
pending:等待回调success:授权成功error:授权失败,需要重新检查浏览器回调或网络
如果弹窗里已经能看到类似 ...?code=...&state=... 的回调地址,但 Metapi 页面还没成功:
- 复制浏览器最终回调 URL
- 回到「OAuth 管理」
- 粘贴到手动回填区域提交
成功后通常会看到两层结果:
- 「OAuth 管理」页里出现新的连接记录
- 「站点管理」页里出现对应 provider 的站点行
| 方式 | 入口 | 适合什么 | 典型例子 |
|---|---|---|---|
| 普通站点 + Session | 站点管理 / 账号管理 | 有后台面板,需要签到、余额、账号令牌管理 | New API、One API、DoneHub、AnyRouter、Sub2API |
| 普通站点 + API Key | 站点管理 / API Key 管理 | 只关心代理调用和模型列表 | OpenAI-compatible、Claude-compatible、CPA |
| OAuth 连接 | OAuth 管理 | 需要 provider 官方授权、刷新、重绑 | Codex、Claude、Gemini CLI、Antigravity |
简单判断:
- 你拿到的是 站点后台地址,优先看 上游接入
- 你拿到的是 provider 登录授权,优先看这页
OAuth 成功后,Metapi 会确保对应 provider 的站点存在。这样做是为了让 OAuth 连接也能融入现有的:
- 站点列表
- 路由通道
- 账号归属
- 代理与重绑逻辑
但这类站点和普通面板站点仍然不同:
- 它们通常不是拿来手动登录的
- 不要把它理解成“我又多了一个可签到的面板站”
- 更准确地说,它是 OAuth 账号在 Metapi 里的宿主站点
如果你想脚本化处理 OAuth,可以用这些接口:
| 接口 | 作用 |
|---|---|
GET /api/oauth/providers |
获取当前可用 provider 列表 |
POST /api/oauth/providers/:provider/start |
启动 OAuth 流程 |
GET /api/oauth/sessions/:state |
轮询会话状态 |
POST /api/oauth/sessions/:state/manual-callback |
手动回填 callback URL |
GET /api/oauth/connections |
列出现有连接 |
POST /api/oauth/connections/:accountId/rebind |
重绑已有 OAuth 连接 |
DELETE /api/oauth/connections/:accountId |
删除 OAuth 连接 |
脚本示例见 管理 API。
通常说明回调监听器不可用,或当前 provider 的启动条件不满足。优先检查:
- 服务是否刚启动但回调监听失败
- 端口是否被占用
- 当前环境是否缺少必要的 OAuth 配置
优先怀疑回调链路没通:
- 如果是远程服务器,先按页面提示建 SSH 隧道
- 如果不方便建隧道,直接用手动 callback 回填
- 如果 provider 页面最终没有
code/state参数,说明授权本身还没成功
有可能需要,尤其是:
- 国内服务器访问 OpenAI / Anthropic / Google OAuth 端点
- 服务器本身不能直连 provider
优先使用:
- 全局
SYSTEM_PROXY_URL - OAuth 启动 / 重绑时指定单次代理
这是预期行为。Metapi 需要一个明确的站点记录来承载:
- 账号所属平台
- 路由与通道归属
- 后续重绑 / 刷新逻辑
它不代表你又新增了一个普通面板站点。