GPT3项目中.env变量OPENAI_API_KEY暴露在dist/main.js的问题求助
解决OpenAI API密钥在前端打包后暴露的问题
核心问题:前端代码运行在用户浏览器中,任何直接嵌入到前端的密钥都会被提取出来,不管用webpack插件还是混淆手段都没法从根本上解决——因为浏览器需要拿到密钥才能发起请求。你之前试的dotenv-webpack、EnvironmentPlugin这些工具,本质都是把密钥注入到前端代码里,打包后自然会出现在main.js中。
正确解决方案:用后端做代理,让后端持有API密钥并调用OpenAI接口,前端只和自己的后端交互,全程不接触敏感密钥。
1. 搭建后端代理(Node.js/Express为例)
先安装依赖:
npm install express openai dotenv
创建后端文件server.js:
require('dotenv').config(); const express = require('express'); const { Configuration, OpenAIApi } = require('openai'); const app = express(); app.use(express.json()); // 后端配置OpenAI密钥(仅后端可见) const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, }); const openai = new OpenAIApi(configuration); // 定义前端可调用的代理接口 app.post('/api/openai', async (req, res) => { try { // 这里可根据你的需求调整OpenAI接口参数 const response = await openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: req.body.messages, }); res.json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); // 启动后端服务 const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`服务运行在端口 ${PORT}`); });
在后端根目录创建.env文件,配置密钥(注意不要提交到版本库):
OPENAI_API_KEY=你的OpenAI密钥
2. 修改前端代码
不再直接调用OpenAI SDK,改为请求自己的后端接口:
// 替换原来的OpenAI初始化及调用代码 async function callOpenAI(messages) { try { const response = await fetch('http://localhost:3001/api/openai', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ messages }), }); const data = await response.json(); return data; } catch (error) { console.error('请求失败:', error); } } // 使用示例 callOpenAI([{ role: 'user', content: '你好' }]).then(data => { console.log(data); });
3. 调整webpack配置
因为前端不再需要接触API密钥,直接移除dotenv相关插件配置:
const path = require('path'); const config = { entry: "./src/index.js", output: { path: path.resolve(__dirname, "dist"), }, plugins: [ // 保留你的其他插件,移除Dotenv相关配置 ], }; module.exports = config;
内容的提问来源于stack exchange,提问作者user21229303
相关产品推荐
相关产品推荐

