API Key 安全最佳实践:只放服务端,每个项目一把 Key
谁拿到 API Key,谁就能用你的余额调用模型。本文给出 8 条做法:只在服务端使用,用环境变量或密钥管理服务保存,按项目拆分,设额度上限和过期时间,开 IP 与模型白名单,定期轮换,盯用量明细,以及泄露后的处理步骤。
谁拿到你的 API Key,谁就能用你的余额调用模型。守住三条底线:Key 只放在服务端;不进前端代码、App 安装包和 git 仓库;每把 Key 都设额度上限。再加上过期时间、IP 白名单和模型白名单,就算某把 Key 泄露了,损失也只限于它自己的额度。
Key 是怎么泄露的
| 常见场景 | 为什么危险 | 正确做法 |
|---|---|---|
| 写在网页、小程序的前端代码里 | 打开浏览器开发者工具就能看到 | 前端调用自己的后端,由后端调用 API |
| 打包进 App 安装包 | 安装包可以被解包,一搜字符串就能找到 | 同样经由后端转发 |
| 提交到 git 仓库 | 仓库一旦公开或被别人克隆就泄露了;删掉文件,历史记录里还在 | 用环境变量;提交过的 Key 一律当作已泄露,马上更换 |
| 贴在聊天群、工单、截图里 | 转发几次就不知道到了谁手里 | 发出去之前先打码 |
| 日志里打印完整的请求头 | 日志系统里的明文很多人都能看到 | 打印前脱敏,只保留首尾几位 |
8 条做法
1. 只在服务端调用
浏览器或 App 调用你自己的后端接口,后端先做登录校验和限流,再带上 Key 请求土土金 API:
import express from 'express'
import OpenAI from 'openai'
const app = express()
app.use(express.json())
const client = new OpenAI({ baseURL: 'https://open.tutujin.com/v1', apiKey: process.env.TUTUJIN_API_KEY })
app.post('/ask', async (req, res) => {
// 先校验你自己的登录状态,并按用户限流
const resp = await client.chat.completions.create({
model: 'gpt-5.4-mini',
messages: [{ role: 'user', content: String(req.body.question ?? '').slice(0, 2000) }],
max_tokens: 500,
})
res.json({ answer: resp.choices[0].message.content })
})
app.listen(3000)Key 只出现在服务器的环境变量里,浏览器拿到的只有回答。
2. 用环境变量或密钥管理服务保存
# 在服务器上设置环境变量,或写进只存在于服务器上的 .env 文件
export TUTUJIN_API_KEY="sk-你的Key"
# 确保 .env 不会被提交到仓库
echo ".env" >> .gitignore团队规模大一些,可以用云厂商的密钥管理服务或 Vault 统一保存和下发,代码里只读取,不写死。
3. 一个项目、一个环境一把 Key
比如「客服机器人-生产」「客服机器人-测试」各用一把。出问题时只停一把,不影响其他业务;用量明细也能按 Key 分清每个项目花了多少。
4. 设额度上限和过期时间
额度上限是这把 Key 最多能花的钱,用完自动停用。过期时间适合临时项目、外包合作和演示环境,到期自动失效,不用记着去删。
5. 开 IP 白名单
只允许你的服务器出口 IP 调用,不在名单里的请求会被拒绝,返回 403。这样 Key 就算被别人拿到,在他的机器上也用不了。服务器换了出口 IP,记得同步更新白名单。
6. 开模型白名单
只放行业务需要的模型,调用名单外的模型会返回 403。Key 泄露后,别人也没法拿它去调昂贵的模型。
7. 定期轮换
每隔一段时间(比如每个季度)换一次 Key:先新建,更新服务端配置,确认调用正常后再删旧的。有人离职、外包项目结束时也要换。
8. 盯着用量明细
用量明细里出现没见过的模型、半夜的调用或者用量突然暴涨,先停用对应的 Key,再查原因。
怀疑泄露时怎么处理
- 在控制台停用或删除这把 Key。
- 新建一把 Key,更新服务端配置并重新部署。
- 在用量明细里核对泄露期间的调用和费用。
- 排查泄露途径:git 历史、日志、前端代码、聊天记录。
- 如果有异常消费,加客服微信
JsnonoChat,提供时间段和报错信息里的 request id。
控制台里的 Key
控制台的 Key 列表只显示掩码,需要时再查看完整 Key。创建后直接写进服务器的环境变量或密钥管理服务,别存在个人电脑的文本文件或聊天记录里。
请求头的写法见认证与 Base URL,401、403 等错误的含义见错误码与重试。额度上限和白名单同时也是控制成本的手段,见如何控制 API 成本。
常见问题
Key 泄露了怎么办?
马上在控制台停用或删除这把 Key,新建一把并更新服务端配置,再到用量明细里核对泄露期间的调用。发现异常消费,加客服微信 JsnonoChat,提供时间段和报错里的 request id。
网页或 App 能直接调用 API 吗?
不建议。前端代码和安装包对用户是可见的,Key 放在里面迟早会泄露。前端应调用你自己的后端接口,由后端带上 Key 请求土土金 API。
IP 白名单填什么?
填调用 API 的服务器出口公网 IP,可以填多个 IP 或网段。不在白名单里的请求会被拒绝,返回 403。
为什么控制台的 Key 列表只显示一部分?
列表只显示掩码,需要时再查看完整 Key,这样在屏幕共享、截图时不容易意外泄露。