上一篇中,我把应用比作一家餐厅:大厅(前端)、厨房(后端)、仓库(DB)。这次要讲 Vibe Coding 中最容易出问题的话题:API,以及 API 密钥。大家应该都见过“绝对不要暴露密钥”的警告,但很少有地方真正说明密钥是什么、在哪里,以及暴露后会发生什么。本文一次整理清楚。
API就是点单窗口
API是 Application Programming Interface 的缩写,忘记全称也没关系。重点是这一点。API是让程序彼此安排工作的点单窗口。
回到餐厅的比喻,顾客不能进入厨房,只能按规定格式提交订单:“泡菜汤一份,少辣。”厨房会自行制作并送出。API正是这个窗口。向指定地址发送指定格式的请求,就会返回指定格式的响应。
Vibe Coder 的应用中,API存在两个方向。
- 我的应用的 API:我的前端让我的后端执行工作的窗口。上一篇提到的
app/api/文件夹就是它。 - 别人的 API:我的应用让其他公司的服务执行工作的窗口。让 ChatGPT 写文章(OpenAI API)、显示地图(地图 API)、处理支付(支付 API),本质上都是向别人的窗口提交订单。
通过 Vibe Coding 制作的应用,大多依靠组合这些“别人的 API”运行。而要向别人的窗口下单,有一样东西必不可少。
API密钥就是公司卡
别人的 API 不是免费窗口。每向 OpenAI 发送一次请求,都会产生费用。因此,每个请求都带有一张身份证,说明“这笔订单该向谁收费?”这就是 API 密钥,一种类似 sk-proj-... 的长随机字符串。
API密钥的性质和公司卡完全一样。
- 无论是谁刷卡,账单都会寄给持卡人。
- 只要知道卡号就能使用。不需要人脸验证,也不需要签名验证。
- 所以,如果把卡号写在公开场所,世界上任何人都能用我的钱付款。
“隐藏密钥”的警告之所以如此严重,原因就在这里。密钥泄露不同于密码泄露。密码改掉就行,但从密钥被盗用到重新签发期间产生的全部费用,都会累积到我的账单上。
泄露后实际会发生什么
人们很容易想:“谁会找到我这个小应用的密钥?”但这是最危险的误解。找到密钥的不是人,而是机器人。
GitHub 等公开代码仓库每天 24 小时都在被数千个机器人扫描。如果不小心把包含密钥的代码上传到公开仓库,机器人通常会在几分钟内将其收集。收集到的密钥会立即被用于免费调用 AI、支付加密货币挖矿费用、发送垃圾邮件等。社区不断出现一夜之间被收取数百万韩元账单的事故案例,原因就在于此。
另一条泄露途径就是上一篇讲过的:**把密钥放进前端。**前端代码会传输到用户浏览器,因此任何人只需右键点击一次“检查”,就能取出密钥。让 AI“接入 OpenAI”时,AI确实可能为了方便把密钥硬编码到前端,所以必须亲自确认。
密钥应该放在哪里
上一篇已经讲过原则:**秘密放在后端。**具体如下。
- 把密钥写入项目的
.env文件。这是只有后端能读取的秘密值存储处。 - 将
.env文件登记到.gitignore中,让 Git 不再跟踪它。这样即使把代码上传到 GitHub,密钥也只会留在自己的电脑上。AI生成的项目通常已经登记,但仍值得亲自检查一次。 - 部署后的应用无法读取电脑上的
.env,因此要在 Vercel 等部署服务面板的“Environment Variables”菜单中单独登记密钥。这部分会在第4篇(部署)中再次讲到。
Next.js还有一个陷阱。如果环境变量名以NEXT_PUBLIC_开头,其值也会传输到**前端。**顾名思义,这意味着它会公开。这里只能放置专门设计为可公开的密钥,例如地图显示用密钥;对于 OpenAI 等会产生费用的密钥,绝对不能加上NEXT_PUBLIC_。如果是 AI 加上的,这本身就是危险信号。
应用自查方法
现在就可以进行以下3项检查。
- 检查浏览器:在已部署的网站上右键点击 → 检查,然后在顶部的 Network 或 Sources 标签中搜索
sk-、key、secret等词。如果搜索到自己的秘密密钥,就说明已经泄露。 - 检查 GitHub:如果仓库处于公开(Public)状态,就在仓库搜索框中搜索密钥的开头部分。即使只留在过去的提交中,也属于泄露。
- 让 AI 进行审计:让它“找出这个项目中所有会将 API 密钥或秘密值传输到前端的地方”。创建项目时犯过错的 AI,在查找时也可能表现很好。
如果已经泄露
隐藏已经泄露的密钥没有用。必须假设机器人已经复制了它。顺序如下。
- 在相关服务的面板中**删除(撤销)**该密钥。从这一刻起,盗用就会停止。
- 重新签发密钥,这次只将它放入
.env和部署面板中。 - 设置服务的使用量上限(spending limit)。这会成为下一次事故的损失上限。第7篇(账单爆炸)将详细讨论这一点。
总结
- API是程序之间的点单窗口,而我的应用依靠组合别人的 API 运行。
- API密钥就是公司卡。无论谁使用,账单都会寄给我。
- 机器人会在几分钟内找到密钥。“我的应用很小”并不能构成防护。
- 密钥只能放在两个地方:
.env(本地)和部署面板的环境变量中。带有NEXT_PUBLIC_的计费密钥就是危险信号。 - 如果已经泄露,不要只把它隐藏起来,应按撤销 → 重新签发 → 设置上限的顺序处理。
下一篇是 Git。我们将讨论:即使 AI 能写完全部代码,为什么大家仍然建议使用 Git;以及当 AI 把原本正常的应用弄坏时,如何在1分钟内恢复。

![[Vibe Coder #2] API到底是什么,为什么要隐藏API密钥? 封面图](/assets/images/posts/db572cb8-3e5f-40ff-b874-7b22e30a8f9e/api-key-hide-1.jpg)