如何在生产中安全地使用环境变量秘密

时间:2018-05-29 18:16:49

标签: node.js reactjs pm2

我想使用环境变量来安全地保存pm2的秘密。

我有一个快速支持服务器的反向代理,每次连接时都使用带有密码的数据库来执行查询。

我想从程序中正常访问它:

procsess.env.my_secret

但我假设只是在运行时设置变量,就像下面的安全一样:

MY_SECRET="secret password" pm2/node my_api_server.js

考虑到我使用pm2,我应该如何设置密码?我希望变量在重启/崩溃时保持不变?

我应该注意,不同的环境处理和通过VCN向其他开发人员传递代码对我来说不那么重要。

2 个答案:

答案 0 :(得分:0)

在过去需要连接数据库的Express后端的ReactJS项目中,我在NPM上使用了dotenv包。一旦作为项目的依赖项添加,您将在服务器文件结构的根目录中创建一个隐藏的.env文件。

在该.env文件中,您可以创建环境变量。这些变量需要以REACT_APP为前缀,如下所示:

REACT_APP_DBURI=<conn string here>
REACT_APP_MAILGUN_API_KEY=<key string here>
REACT_APP_CAPTCHA_SECRET_KEY=<key string here>

您需要在代码中按要求提供包:

require('dotenv').config();

您可以在server.js(或其他)代码中引用它们:

process.env.REACT_APP_VARIABLE_NAME

This Medium article有完整的解释。

希望这有帮助!

答案 1 :(得分:0)

使用.env存储API密钥或凭据会在量产时公开给客户端!
通过React docs-

  

警告:请勿在您的React应用程序中存储任何秘密(例如私有API密钥)!   环境变量已嵌入到内部版本中,这意味着任何人都可以通过检查应用程序的文件来查看它们。

建议将所有环境密钥直接存储在服务器上,并且服务器应用作客户端和API之间的中间点。这样,密钥可以直接应用于服务器,而不会暴露在前端。您可以查看有关如何在特定服务器上设置环境变量的相应文档。

前端代码

fetchData = () => { 
    fetch('/users', { method: 'POST', body: JSON.stringify(data) }
   .then(res => res.json())
    }

服务器代码

app.post('/users', (req, res) => {
    const API_KEY = process.env.API_KEY;
    connection.query(`/apiPath/${API_KEY}`)
}