教程 / OpenAI 与 API

OpenAI API Key 安全使用指南:限额、泄露处理与 401/429 排查

API Key 是用来调用 OpenAI 接口的凭证,和账号密码一样敏感。很多“额度突然没了”“接口一直 401”的问题,根源不是模型,而是 Key 的存放、权限或限额设置。

更新于 2026-10-24由 GPTHubs 团队 整理约 6 分钟读完OpenAI 与 API

先理解 Key 能做什么

拿到 Key 的人可以用你的账户额度调用接口,产生费用,也可能读取该账户下允许访问的资源。它不等同于 ChatGPT 网页登录密码,但泄露后的直接后果通常是账单风险和接口滥用。

  • Key 应该按项目或应用拆分,不要所有服务共用一个。
  • 只给需要的人/服务最小权限,离职或停用时立即吊销。
  • 不要把 Key 当成“临时方便”贴到前端代码、日志或聊天工具里。

创建 Key 与项目隔离

在 OpenAI 平台的 API Keys 页面创建 Key,创建时只显示一次,关闭页面后无法再次查看。建议按“一个应用一个 Key”管理,并在名称里写清用途,例如 gpthubs-prod、local-dev。

如果平台支持项目(Project),把 Key 绑定到对应项目,再给项目设置预算和速率限制。这样某个应用的 Key 泄露或跑飞时,不会直接影响其他业务。

Key 应该放在哪里

服务端应用用环境变量或密钥管理服务;本地开发用 .env.local 之类的文件,并确保它不会进入 Git。浏览器、移动端和公开仓库都不能放长期 Key。

本地环境变量示例
# .env.local(不要提交)
OPENAI_API_KEY=sk-...

# .gitignore
.env
.env.local
.env.*.local
  • 不要在 console.log、错误上报、APM、截图或录屏里输出 Key。
  • 不要通过聊天工具、工单或邮件明文发送 Key;用密钥管理工具共享。
  • 前端如果必须调用模型,走自己的后端代理,不要把 Key 下发到浏览器。
  • 构建产物里不要内联 Key;检查 NEXT_PUBLIC_ 等公开前缀变量。

设置限额与用量告警

至少做三件事:给项目设置月度预算、给 Key 设置可接受的速率/额度、定期看用量曲线。限额不是“限制业务”,而是防止 Key 泄露或代码死循环把额度瞬间打满。

  • 按环境拆分 Key:开发、预发、生产各自独立。
  • 给生产 Key 设置预算上限和告警,异常增长时能第一时间发现。
  • 在应用层加重试上限和熔断,避免 429 时无限重试放大费用。
  • 定期清理不再使用的 Key,尤其是临时测试和外包交接留下的。

怀疑泄露时怎么处理

  1. 01

    立即吊销旧 Key

    先在控制台删除或禁用泄露的 Key,不要等新 Key 配置完再处理。

  2. 02

    创建新 Key 并更新部署

    新 Key 只放到服务端环境变量,更新完成后确认旧 Key 已失效。

  3. 03

    检查用量与账单

    看泄露时间段的请求量、模型和费用;异常用量及时联系平台支持。

  4. 04

    排查泄露路径

    检查 Git 历史、构建日志、前端 bundle、错误上报和聊天记录,避免再次发生。

  5. 05

    清理历史记录

    如果 Key 曾进入 Git 历史,仅删除当前文件不够;需要重写历史或视为永久泄露并吊销。

401 / 403 / 429 分别是什么意思

状态码常见原因处理方式
401Key 缺失、格式错误、已吊销,或请求了不匹配的 base URL检查 Authorization 头、环境变量和接口地址
403Key 没有该模型/项目/地区的权限确认项目权限、模型访问权限和账户状态
429触发速率限制,或额度不足区分 rate limit 与 quota;退避重试,检查余额和限额
insufficient_quota账户额度用完或账单未结清充值/调整预算,确认账单状态
500 / 503平台侧临时故障指数退避重试,避免同时放大并发

429 不一定代表“Key 坏了”。如果错误体是 rate limit,按 Retry-After 或指数退避重试;如果是额度不足,重试再多次也没用,需要处理账单或限额。

一个带退避上限的重试思路
async function requestWithRetry(fn, maxAttempts = 3) {
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
    try {
      return await fn();
    } catch (error) {
      const status = error?.status;
      if (status !== 429 && status !== 500 && status !== 503) throw error;
      if (attempt === maxAttempts) throw error;
      await new Promise((resolve) => setTimeout(resolve, 2 ** attempt * 500));
    }
  }
}

常见问题

API Key 和 ChatGPT 密码是同一个东西吗?

不是。API Key 用于程序调用接口并按用量计费;ChatGPT 密码用于登录网页/客户端。两者权限和风险不同,但都应该当作敏感凭证保管,不能分享。

Key 泄露后只删掉代码里的那一行够吗?

不够。只要 Key 曾经出现在公开仓库、日志或第三方系统里,就应按已泄露处理:立即吊销、创建新 Key、检查异常用量,并排查所有可能的传播路径。

为什么设置了限额还是会超支?

限额可能按项目、Key 或账户不同维度生效,也可能有延迟;并发请求、重试和多个 Key 都会叠加消耗。建议同时设置预算告警、应用层重试上限和定期用量检查。

官方文档与参考

本文依据上述官方文档整理;价格、额度与功能会随官方更新变化,第三方中转站的行为以其自身说明为准。