直接把 DeepSeek API Key 写在前端代码里是不安全的,无论尝试何种前端加密手段,密钥最终都会在浏览器端暴露,最稳妥的方案是搭建后端服务进行请求转发。
先说结论:API Key 必须保存在服务端环境变量中,前端只负责发起业务请求,由后端补充密钥后转发给 DeepSeek 接口。
- 先判断:确认当前密钥是否已泄露,若已提交到公开仓库建议立即作废重置。
- 优先做:搭建中间层服务,将密钥存储在服务器环境变量或密钥管理服务中。
- 再验证:通过浏览器网络面板确认请求中不包含密钥,并在平台后台监控用量异常。
快速处理思路
不要试图在前端混淆或加密密钥,浏览器执行的代码对用户是完全透明的。正确的架构流程是:用户浏览器发起请求到你的服务器,你的服务器读取本地配置好的 Key,再向 DeepSeek 发起请求,最后将结果返回给浏览器。
如果已经泄露,第一步是去控制台删除旧 Key 生成新 Key,第二步才是修补代码漏洞。
为什么会这样
前端代码(HTML/CSS/JavaScript)最终都会下载到用户的浏览器中。即使你使用了加密算法,解密的逻辑和密钥本身也必须下发给浏览器才能运行,这意味着任何懂技术的人都可以通过调试工具找到明文密钥。
API Key 通常关联着计费和配额,一旦泄露,他人可以直接消耗你的额度,甚至通过你的接口发布违规内容导致账号被封禁。后端转发能确保密钥只停留在你的服务器内存中,不会通过网络传输给终端用户。
分步处理
1. 重置密钥(如果已泄露)
登录 DeepSeek 开放平台控制台,找到 API 密钥管理页面,删除疑似泄露的密钥,创建新的密钥。公开资料中没有看到可靠的量化数据说明泄露后被盗用的具体概率,但风险始终存在。
2. 服务端存储密钥
不要将密钥硬编码在代码文件里。使用环境变量存储,例如在 Linux 服务器上:
export DEEPSEEK_API_KEY="sk-..."
或者使用专业的密钥管理工具。确保代码仓库中不包含含有密钥的配置文件,将 .env 文件加入 .gitignore。
3. 编写转发接口
在你的后端服务(如 Node.js、Python、Go)中创建一个接口。以下是一个概念性的 Node.js 示例逻辑:
app.post('/api/chat', async (req, res) => {
const response = await fetch('https://api.deepseek.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}`
},
body: JSON.stringify(req.body)
});
res.json(await response.json());
});
4. 增加访问控制
不要将这个转发接口完全公开。建议加上你自己的用户登录验证,或者限制请求来源域名(CORS),防止他人直接调用你的转发服务消耗你的配额。
怎么验证是否生效
1. 浏览器检查
打开浏览器开发者工具(F12),切换到 Network 标签页。发起一次对话请求,查看请求头(Headers)。确认请求头中没有出现 `Authorization: Bearer sk-...` 字段,该字段只应出现在你的服务器到 DeepSeek 之间的请求中。
2. 平台监控
定期登录 DeepSeek 平台后台,查看用量统计和日志。如果发现非预期时间的调用或用量激增,说明可能存在泄露或未授权的访问。
常见坑
1. 代码仓库泄露
很多人虽然做了后端转发,但把包含 Key 的配置文件提交到了 GitHub 等公开仓库。务必检查提交历史,使用 git-secrets 等工具扫描。
2. 转发接口无鉴权
如果你只做了转发但没有给自己的接口加密码或登录验证,别人拿到你的接口地址后,依然可以免费消耗你的额度。这相当于把钥匙换了一把锁,但锁是敞开的。
3. 错误信息回传
后端请求 DeepSeek 出错时,不要直接把原始错误信息返回给前端,某些错误信息可能包含敏感调试数据。建议统一封装错误码。