6.1 .env 文件配置
Tip
学会用.env文件管理敏感信息,避免将密钥提交到GitHub导致泄露。
1. 为什么要学这个?
你正在开发一个调用OpenAI接口的应用。为了图省事,你直接把Key写在了代码里:
const apiKey = "sk-abcdefg123456..."; // 永远不要这样做!
你开心地把代码提交到了GitHub公开仓库。
5分钟后,你收到了一封邮件:"您的OpenAI额度已耗尽"。
你一脸懵逼,查了日志才发现,几百个来自俄罗斯和印度的IP在疯狂刷你的接口。
这就是硬编码密钥(Hardcoding Secrets)的代价。
2. 核心概念
2.1 环境变量(.env)
技术定义:环境变量是操作系统或运行环境提供给应用程序的动态命名值。在Node.js/Next.js开发中,通常使用
.env文件来存储敏感配置,这些变量在代码中通过process.env.VARIABLE_NAME访问。
就像饭店的秘密配方。
- 代码(Code):是菜谱中公开的部分,比如"宫保鸡丁需要鸡肉、花生、辣椒",所有人都能看
- 环境变量(.env):是厨师手里的秘密酱汁,比如"秘制酱料A",这个瓶子只有后厨(服务器)有,绝不给客人(Github)看
2.2 保险箱机制
graph TD
subgraph Local["你的电脑(Local)"]
Dev[".env文件(保险箱)"] -->|注入| App["运行中的App"]
Code["代码文件"] --> App
end
subgraph git["GitHub(公开)"]
Code -->|git push| Repo["远程仓库"]
Dev -.->|被.gitignore拦截| Repo
end
style Dev fill:#ef9a9a
style Repo fill:#90caf9
3. 实战步骤
第一步:创建保险箱
在项目根目录新建一个.env文件(注意前面有个点):
OPENAI_API_KEY=sk-123456789...
DATABASE_URL=postgres://user:password@localhost:5432/mydb
第二步:设置屏蔽罩
打开根目录下的.gitignore文件,确保里面有一行:
.env
.env.local
*.pem
**这一步至关重要!**它告诉Git:".env是我的私人物品,不要打包带走。"
第三步:代码中取钥匙
在Next.js中,直接使用:
// ❌ 错误:直接写死
// const key = "sk-123..."
// ✅ 正确:从保险箱里拿
const key = process.env.OPENAI_API_KEY;
第四步:给队友留模具(.env.example)
既然.env不能上传,队友拉代码后怎么知道要配什么?
创建一个.env.example文件,只留变量名,不填值:
# .env.example (这个要提交到GitHub)
OPENAI_API_KEY=
DATABASE_URL=
4. 适用场景
| 🎯 场景 | 推荐做法 |
|---|---|
| API密钥 | OpenAI Key, AWS Secret Key等 |
| 数据库密码 | 连接PostgreSQL或MongoDB的URL |
| 支付凭证 | Stripe或支付宝的私钥 |
| 环境区分 | 开发环境用测试库(DB_TEST),生产环境用正式库(DB_PROD) |
5. 避坑指南
| ✅ 推荐做法 | ❌ 禁忌 |
|---|---|
| 必须加入.gitignore | 觉得"我就测试一下"先提交再说(Git有历史记录,撤回也没用) |
变量名全大写+下划线(API_KEY) |
使用驼峰命名(apiKey)或包含空格 |
| 修改.env后重启终端 | 以为保存文件就会实时生效(环境变量是启动时加载的) |
6. 真实案例
Story
2016年,Uber 5700万用户数据泄露案
2016年,黑客窃取了Uber 5700万乘客和司机的个人信息。入侵路径:黑客在GitHub上找到了Uber工程师的一个私有仓库(工程师为了方便在家办公),在代码里发现了一行硬编码的AWS用于访问S3的密钥。虽然仓库是私有的,但如果有人获得了访问权限(比如通过凭证撞库),这些密钥就直接暴露了。后果:Uber支付了10万美元"封口费"试图隐瞒此事,结果东窗事发,被罚款1.48亿美元,CSO(首席安全官)被解雇并面临刑事指控。
Vibe心法:Git历史记录没有撤回键,一旦误传,终身泄露——.gitignore是保护密钥的第一道也是最后一道防火墙。
7. 本章小结
- 🔐 最后防线:环境变量是将敏感数据与业务逻辑解耦的唯一正确方式
- 🚫 Git禁区:.env文件必须死死锁在本地,绝对不能出现在.gitignore之外
- 🔄 重启生效:修改了环境变量,必须重启开发服务器(
Ctrl+C->pnpm dev) - 📝 .env.example:给队友留模具,只留变量名不填值