鉴权

API Key 格式 + 3 种鉴权方式 + Key 管理 + 配额

鉴权

API Key 格式

sk-gpushare-{32 字符十六进制}

例: sk-gpushare-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

总长度 44 字符。原始 Key 只在创建时展示一次,之后不可见(数据库只存 SHA-256 hash)。

创建 / 管理 Key

访问 model.dflop.top/keys:

  1. Create Key —— 命名 + 可选 allow-list + 预算
  2. 当场复制 —— 关闭弹窗后看不到原始 Key
  3. 查看用量 —— 实时 quota_used 跟 历史调用日志
  4. 撤销 —— 任何 Key 可立即 disable

Key 的可配置项

含义默认
name可读名称,审计用(空)
allowed_models限制只能调哪些 model;空数组 = 任意(空,允许全部)
quota_total预算上限 ($)$1 (创建时充值)
max_input_tokens_per_request单次请求最大 input tokens50,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 SDKAuthorization: Bearer (SDK 默认)
Anthropic SDKx-api-key (SDK 默认)
Google Gemini SDKAuthorization: Bearer (覆盖 SDK 默认,避免 URL 泄漏)
curl / 手工x-api-key
服务端代码env var → x-api-keyAuthorization: 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 做两步:

  1. Pre-charge —— 用 max_tokens 估算最坏情况,跟 quota_total - quota_used 比对,超了 412
  2. 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,跑完撤销
团队协作每人一把,按用户名命名

安全建议

  1. 永远不要 把 Key 写进 git 仓库 / 截图 / Slack 消息
  2. direnv / 1Password CLI / Doppler 注入 env var
  3. 怀疑泄漏立即在控制台撤销
  4. 服务端代码用环境变量,不要从前端发起调用 (会暴露 Key)
  5. 浏览器端必须调用时,做后端代理转发

CSRF / Origin

GPUShare gateway endpoints 不强制 Origin / CSRF token —— 全靠 Key 鉴权。所以 Key 泄漏 = 完全暴露。

(model.dflop.top 控制台自身用 cookie + CSRF token,但那是单独的管理面板鉴权,不影响 gateway API)