AI API Key 怎么拿、怎么存、怎么分:从本地开发到生产的接入与隔离

2026-10-01 89 0

AI API Key 用来证明“这次请求是谁发的、该记在谁的账上”。它同时承担身份认证、权限控制和用量计费三件事。Key 一旦落到别人手里,别人可以直接用你的额度。

结论先放在前面:

  • Key 不写进代码,不进代码仓库,不下发到浏览器或手机 App。
  • 本地开发用环境变量或 .env 文件,并把 .env 加进 .gitignore。生产环境用部署平台的 Secrets 或专门的密钥管理系统注入。
  • 不同环境、不同业务各用一把 Key。哪把出了问题就单独吊销哪把,不影响其他服务。
  • 发现泄露时先吊销,再查原因。

下面按拿到 Key 之后的实际顺序展开。

第一步:先定 Key 放在哪,再写代码

很多泄露发生在“先跑通再说”的阶段:Key 直接写在脚本里,跑通后顺手提交,仓库后来又被设成公开。OpenAI 的安全规范把这种做法列为明确禁止项,包括不要在客户端代码里硬编码,不要提交到 GitHub 这类公开仓库。

本地开发用环境变量就够了:

# macOS / Linux,写进 ~/.zshrc 或 ~/.bashrc
export NEXAIX_API_KEY="sk-..."

如果项目习惯用 .env 文件:

# .env
NEXAIX_API_KEY=sk-...
# .gitignore
.env

这里有个容易漏掉的情况:.env 如果已经被提交过一次,之后再加进 .gitignore,它也不会从历史记录里消失。这种情况应当把 Key 当作已泄露处理,处置方法见后文。

生产环境最好不要往服务器上手动放 .env。容器平台、CI/CD 和云厂商都有 Secrets 或 Secret Manager,部署时把 Key 作为环境变量注入。这样 Key 不会出现在镜像、仓库或部署脚本里,权限也能单独管控。

前端和移动端:Key 只能留在服务器

网页里的 JavaScript、打包后的 App 都能被用户拆开查看,混淆也挡不住。如果你的产品需要在前端调用模型,正确的结构是:前端调用你自己的后端,后端拿 Key 去请求模型 API。这样做还有一个好处,你可以在后端按用户做频率限制,避免单个用户把整把 Key 的配额用光。

API Key 只保存在后端,前端通过后端间接调用模型,不同环境使用不同的 Key

第二步:接入代码,只改 base_url 和 Key

目前很多模型服务都提供 OpenAI 兼容接口。接入时只需要给 SDK 配置两样东西:基础地址 base_url 和对应的 API Key,业务逻辑不用重写。

以 NexAIX 为例,端点是 https://api.nexaix.net/v1,从官方 OpenAI 接口迁移过来时只改这一行地址。模型名以模型页为准。模型清单上标明了每个模型的供给方式:开源权重模型部署在自有算力上,闭源模型走厂商官方授权渠道。选模型时可以一起确认。

Python:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["NEXAIX_API_KEY"],  # 没配置时直接报 KeyError,比静默传空值好排查
    base_url="https://api.nexaix.net/v1",
)

resp = client.chat.completions.create(
    model="<模型页上的模型名>",
    messages=[{"role": "user", "content": "ping"}],
)
print(resp.choices[0].message.content)

Node.js:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.NEXAIX_API_KEY,
  baseURL: "https://api.nexaix.net/v1",
});

写代码之前,可以先用 curl 确认 Key 本身没问题:

curl https://api.nexaix.net/v1/chat/completions \
  -H "Authorization: Bearer $NEXAIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"<模型页上的模型名>","messages":[{"role":"user","content":"ping"}]}'

如果返回 401,常见原因有:Key 复制时带了空格或换行,环境变量没在当前终端或进程里生效,Key 已被吊销,或者 Key 和 base_url 不是同一家服务的。最后一种在迁移时很常见:地址改了,读取的却还是旧服务的 Key。各状态码的具体排查方法可以看 AI API 错误码怎么看。

关于第三方客户端和框架:不同工具读取的环境变量名不一样。有的读 OPENAI_API_KEY 和 OPENAI_BASE_URL,有的要在设置界面里填。以工具自己的文档为准,不要假设它会自动读取你设定的变量名。

第三步:按环境和业务拆分 Key

一把 Key 用遍所有地方,平时省事,出了问题很难处理:账单分不清是哪个服务花的;测试脚本写出死循环,会把生产配额一起耗光;一旦泄露只能整体更换,所有服务同时受影响。

比较实用的拆法:

  • 按环境:开发、测试、生产各一把。开发用的 Key 可以放宽管理,生产用的 Key 只放在 Secrets 里,人手上不留副本。
  • 按业务或服务:客服机器人、内部知识库、批处理任务各一把。这样能看清每条业务的用量,限流时也不会互相挤占。
  • 命名带上用途,比如 prod-support-bot、staging-batch。半年后打开控制台,还能分清哪把 Key 是干什么的。

NexAIX 按 Key 隔离,每把 Key 有独立的配额、权限和用量账单,按上面的方式拆分后,能直接看到每条线各用了多少。至于权限具体能细到什么程度,比如能否限定某把 Key 只调用特定模型,请以控制台当前提供的选项为准。

Key 泄露了:先吊销,再排查

常见的泄露迹象:用量突然上涨、出现不认识的调用时段、收到代码托管平台的密钥扫描告警。处理顺序如下:

  1. 立即吊销或删除这把 Key。 不要先去改代码或清理 Git 历史,Key 已经暴露,它每多有效一分钟,就多一分钟被盗用的可能。
  2. 新建一把 Key,写入 Secrets 或环境变量,重新部署相关服务。前面按服务拆过 Key 的话,只有这一个服务需要处理。
  3. 核对用量记录,确认异常调用从什么时候开始、用了多少。
  4. 找到泄露途径并堵上:被提交进仓库、写在日志里、出现在截图或工单里,还是在前端代码中被打包了出去。
  5. 如有需要再清理 Git 历史。注意,清理历史只能防止以后被看到,不能撤回已经被看到的内容,所以第 1 步不能省。

日志是容易被忽视的泄露途径。打印请求头、把完整的配置对象写进日志,或者错误上报工具自动收集请求信息,都可能把 Key 带出去。需要在日志里核对时,只输出 Key 的末几位。

定期轮换

即使没有发生泄露,生产用的 Key 也值得定期更换,离职交接、外包合作结束等节点尤其需要换。为了不中断服务,可以分三步:先建新 Key 并部署上线,确认流量已全部切到新 Key,再吊销旧 Key。生产服务只要从 Secrets 读取 Key,轮换时就只需要更新一处配置,再重新部署一次。

上线前快速自查

  • 代码、镜像、仓库历史里搜不到 Key 明文
  • 前端产物里没有 Key,所有模型调用都经过自己的后端
  • 开发、测试、生产使用不同的 Key
  • 日志和错误上报里不会出现完整的 Key
  • 有人知道泄露时去哪里吊销 Key、谁来重新部署

这几项都确认后,再去处理限流、超时这类运行中的问题,例如参考 AI API 故障排查,按顺序定位 429、超时和截断。

相关文章

开源权重模型 API 和官方授权渠道有什么区别:精度、上下文、留存与限流怎么看
怎么验证 AI API 有没有记录对话内容:能查什么、查不到什么、怎么防
模型推理精度 BF16 和 FP8 有什么区别:显存、速度、质量与选型
LangChain 怎么改自定义 base_url:Python、JS 写法、环境变量优先级与 404 排查
Cherry Studio 怎么添加自定义大模型:服务商、API 地址、模型 ID 与报错排查
Cline 怎么配置自定义模型 API:OpenAI Compatible 的 Base URL、Key 与模型参数

评论(0)

暂无评论

发布评论