React里把API Key写在组件里提交请求,这样会不会泄露?
我在写一个天气查询组件时,直接把OpenWeatherMap的API Key写在React组件的请求里了。但同事说这样部署后会被别人直接看到,应该怎么办?我试过用.env文件存变量,但开发环境老报401错误…
function Weather() {
const API_KEY = 'my-secret-key-12345'; // 这样写有问题吗?
useEffect(() => {
fetch(`https://api.openweathermap.org/data/2.5/weather?q=London&appid=${API_KEY}`)
.then(res => res.json())
.then(data => console.log(data));
}, []);
return Weather data here;
}
后来改用process.env.REACT_APP_API_KEY后,开发服务器能跑通,但构建生产版本时又提示无效密钥。难道环境变量只能用在特定环境?有没有更安全的存储方式?
你用
.env文件是对的,但需要注意几点:1. 确保你的环境变量名以
REACT_APP_开头,比如REACT_APP_API_KEY,否则在构建时不会被注入。2.
.env文件必须放在项目根目录下,**不是 src 目录**。3. 开发环境和生产环境读取的是不同的
.env文件,比如.env.development和.env.production,确保你为不同环境配置了正确的值。你的代码大致没问题,调整后可以这样写:
如果你在生产构建时报错,很可能是
.env.production没有配置或者被忽略了。你可以临时在代码里打印一下process.env.REACT_APP_API_KEY,确认是否真的读到了。真正安全的做法是:**前端不该直接调用带API Key的第三方接口**,中间应该加一层后端代理。这样Key可以藏在服务端,前端只调自己的接口。比如用Node.js做个简单中转服务:
前端只调
/weather接口即可,这样API Key就不会暴露出去。简单说,前端环境变量只能用于开发调试,生产环境需要通过后端代理请求来保护密钥。下面给个完整方案:
1. 后端写个简单的代理接口,比如用Express:
2. 前端改成调用你的代理接口:
这样API Key就安全地保存在后端了。至于你之前401错误,可能是环境变量没正确加载或者生产构建时路径不对。不过既然都做代理了,这些麻烦就不用管了。