第三方连接账户
Connected Accounts 是 OpenEdge 的凭据和授权中心。用户可以先连接外部 provider,再在多个服务实例中复用这些连接。
为什么需要它
如果没有连接账户,每个服务都要单独保存 provider key、webhook token 或 OAuth token。这样不利于安全、轮换和用户理解。
Connected Accounts 统一管理:
- Provider 目录。
- 加密 API Key 存储。
- 连接状态。
- Scope 和 provider 元数据。
- 测试和审计事件。
- OAuth 授权流程。
支持的 Provider
| Provider | 授权方式 | 状态 | 用途 |
|---|---|---|---|
| OpenAI-compatible | API Key | 可用 | AI 大模型网关 |
| OpenRouter | API Key | 可用 | AI 大模型网关 |
| DeepSeek | API Key | 可用 | AI 大模型网关 |
| Custom API Key | API Key | 可用 | AI、Webhook Push、插件 |
| Telegram Bot | API Key | 可用 | Webhook Push |
| Slack | OAuth/webhook | 规划中 | 消息推送 |
| GitHub | OAuth | 规划中 | 开发者自动化 |
| Discord | OAuth | 可用 | 社群自动化身份授权 |
控制台流程
- 打开控制台。
- 进入 Connections。
- 选择 provider。
- 输入显示名称和 API Key。
- 可选填写 provider base URL。
- 保存并测试连接。
- 在 AI Model Gateway 或 Webhook Push 的服务配置中选择该连接。
Discord 连接通过 Provider Catalog 里的 Connect 发起。OpenEdge 会跳转到 Discord 授权页,回调时校验 OAuth state,加密保存 token,并把 Discord user id/name 作为 provider 元数据保存。
API 路由
控制台路由需要登录态:
http
GET /console/connections/providers
GET /console/connections
POST /console/connections/api-key
POST /console/connections/:id/test
DELETE /console/connections/:id
GET /console/connections/:provider/start
GET /oauth/connections/:provider/callback创建 API Key 连接示例:
json
{
"provider": "openrouter",
"display_name": "OpenRouter Production",
"credentials": {
"api_key": "sk-or-..."
},
"config": {
"base_url": "https://openrouter.ai/api/v1"
},
"scopes": ["chat"]
}响应不会返回明文密钥:
json
{
"success": true,
"data": {
"id": "conn_...",
"provider": "openrouter",
"auth_type": "api_key",
"display_name": "OpenRouter Production",
"status": "active",
"credentials": {
"api_key": "configured...[REDACTED]"
}
}
}Discord OAuth 需要配置以下 Worker secret/config:
text
DISCORD_CLIENT_ID
DISCORD_CLIENT_SECRET
CONFIG_ENCRYPTION_KEY
FRONTEND_URL如果没有设置自定义 DISCORD_OAUTH_REDIRECT_URI,需要在 Discord Developer Portal 注册这个回调地址:
text
https://api.open4x.com/oauth/connections/discord/callback服务引用
服务实例通过 connected_account_id 引用连接:
json
{
"connected_account_id": "conn_..."
}运行时 OpenEdge 会检查:
- 连接是否属于当前用户。
- 连接状态是否为 active。
- provider 类型是否允许被当前服务使用。
- 加密凭据是否能解密。
base_url等配置是否通过安全校验。
安全要求
- 明文 API Key 只存在于请求内存中。
- 加密凭据保存在 D1。
- 加密密钥必须配置为
CONFIG_ENCRYPTION_KEY。 - OAuth callback 使用保存在
connection_oauth_states的一次性 state。 - 删除或禁用的连接不能继续被服务调用。
- 连接测试只保存摘要,不保存完整上游响应。