鉴权
API Key 格式 + 3 种鉴权方式 + Key 管理 + 配额
鉴权
API Key 格式
sk-gpushare-{32 字符十六进制}
例: sk-gpushare-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
总长度 44 字符。原始 Key 只在创建时展示一次,之后不可见(数据库只存 SHA-256 hash)。
创建 / 管理 Key
- Create Key —— 命名 + 可选 allow-list + 预算
- 当场复制 —— 关闭弹窗后看不到原始 Key
- 查看用量 —— 实时 quota_used 跟 历史调用日志
- 撤销 —— 任何 Key 可立即 disable
Key 的可配置项
| 项 | 含义 | 默认 |
|---|---|---|
name | 可读名称,审计用 | (空) |
allowed_models | 限制只能调哪些 model;空数组 = 任意 | (空,允许全部) |
quota_total | 预算上限 ($) | $1 (创建时充值) |
max_input_tokens_per_request | 单次请求最大 input tokens | 50,000 |
expires_at | 过期时间 | 无 |
enabled | 启用 / 禁用 | true |
3 种鉴权方式
Gateway 按以下优先级查找 Key,任一就近一种生效:
1. x-api-key Header (推荐)
curl https://api.dflop.top/v1/messages \
-H "x-api-key: sk-gpushare-xxx" \
...
Anthropic SDK 默认走这条。最直白,也最不易被中间层吞掉。
2. ?key= Query Param
curl "https://api.dflop.top/v1beta/models/gemini-2.5-pro:generateContent?key=sk-gpushare-xxx" \
...
Google genai SDK 默认走这条。不推荐手写 —— Key 会出现在 access log / browser history,有泄漏风险。
3. Authorization: Bearer Header
curl https://api.dflop.top/v1/chat/completions \
-H "Authorization: Bearer sk-gpushare-xxx" \
...
OpenAI SDK 默认走这条。
推荐做法
| 客户端 | 推荐方式 |
|---|---|
| OpenAI SDK | Authorization: Bearer (SDK 默认) |
| Anthropic SDK | x-api-key (SDK 默认) |
| Google Gemini SDK | Authorization: Bearer (覆盖 SDK 默认,避免 URL 泄漏) |
| curl / 手工 | x-api-key |
| 服务端代码 | env var → x-api-key 或 Authorization: Bearer |
用 env var 不要硬编码
# ~/.bashrc
export GPUSHARE_API_KEY=sk-gpushare-xxx
client = OpenAI(
api_key=os.environ["GPUSHARE_API_KEY"],
base_url="https://api.dflop.top/v1",
)
配额
GPUShare 采用 预付 + 配额 计费,不是 post-pay。
计费模型
每个 Key 有独立预算池:
quota_total—— 创建时设的预算上限 ($)quota_used—— 已消费 (按真实 token 用量 × pricing.json 单价)
每次请求 gateway 做两步:
- Pre-charge —— 用 max_tokens 估算最坏情况,跟
quota_total - quota_used比对,超了 412 - Settle —— turn 结束后用真实 token 用量
UPDATE quota_used
配额耗尽
返回 HTTP 412 Precondition Failed:
{"error": {"message": "Key quota exhausted (used: $5.00 / total: $5.00)", "type": "insufficient_quota", "code": "quota_exhausted"}}
修复: 在 model.dflop.top/keys 给 Key 充值,或新建一把 Key。
Key Quota ≠ 账户余额
重要: Key 的
quota_total跟账户users.balance是两个独立池。
- 账户充值 $50 进
users.balance—— Key 不会自动多预算 - Key 跑爆配额 —— 不会扣账户余额
- Key 删除 —— 不会退账户余额
每把 Key 一旦创建预算就独立。这设计让企业用户可以按业务线分预算 (一把 Key 一条业务线一份审计)。
多 Key 策略
推荐分场景建多把 Key:
| 场景 | Key 配置建议 |
|---|---|
| 个人开发 / 试玩 | 一把 allow-all,$5–10 预算 |
| 生产服务 | 一把 allow-list 锁定 1-2 个 model,固定预算 |
| 临时调用 / spike | 一把短预算 Key,跑完撤销 |
| 团队协作 | 每人一把,按用户名命名 |
安全建议
- 永远不要 把 Key 写进 git 仓库 / 截图 / Slack 消息
- 用 direnv / 1Password CLI / Doppler 注入 env var
- 怀疑泄漏立即在控制台撤销
- 服务端代码用环境变量,不要从前端发起调用 (会暴露 Key)
- 浏览器端必须调用时,做后端代理转发
CSRF / Origin
GPUShare gateway endpoints 不强制 Origin / CSRF token —— 全靠 Key 鉴权。所以 Key 泄漏 = 完全暴露。
(model.dflop.top 控制台自身用 cookie + CSRF token,但那是单独的管理面板鉴权,不影响 gateway API)