先理解 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,尤其是临时测试和外包交接留下的。
怀疑泄露时怎么处理
- 01
立即吊销旧 Key
先在控制台删除或禁用泄露的 Key,不要等新 Key 配置完再处理。
- 02
创建新 Key 并更新部署
新 Key 只放到服务端环境变量,更新完成后确认旧 Key 已失效。
- 03
检查用量与账单
看泄露时间段的请求量、模型和费用;异常用量及时联系平台支持。
- 04
排查泄露路径
检查 Git 历史、构建日志、前端 bundle、错误上报和聊天记录,避免再次发生。
- 05
清理历史记录
如果 Key 曾进入 Git 历史,仅删除当前文件不够;需要重写历史或视为永久泄露并吊销。
401 / 403 / 429 分别是什么意思
| 状态码 | 常见原因 | 处理方式 |
|---|---|---|
| 401 | Key 缺失、格式错误、已吊销,或请求了不匹配的 base URL | 检查 Authorization 头、环境变量和接口地址 |
| 403 | Key 没有该模型/项目/地区的权限 | 确认项目权限、模型访问权限和账户状态 |
| 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 都会叠加消耗。建议同时设置预算告警、应用层重试上限和定期用量检查。
官方文档与参考
本文依据上述官方文档整理;价格、额度与功能会随官方更新变化,第三方中转站的行为以其自身说明为准。