为什么以及如何在Node.js中的环境变量中放置秘密?

为什么以及如何在Node.js中的环境变量中放置秘密?,node.js,express,jwt,environment-variables,Node.js,Express,Jwt,Environment Variables,我对Node.js和Express比较陌生,我遵循一个指南,在我的站点中添加使用JWT的身份验证。我对本指南中关于使用秘密的一点感到困惑,即: JWT库将在创建和验证令牌时读取此秘密。在生产中,我们需要将这个秘密存储在环境变量中,而不是存储在文件中 在指南中,他们将秘密放在配置文件中。我希望该指南描述了为什么JWT秘密应该是一个环境变量而不是配置文件,但它非常模糊。那么,为什么秘密应该是环境变量,以及使用秘密的其他最佳实践是什么?我决定使用Passport&Express会话来进行身份验证,而不

我对Node.js和Express比较陌生,我遵循一个指南,在我的站点中添加使用JWT的身份验证。我对本指南中关于使用秘密的一点感到困惑,即:

JWT库将在创建和验证令牌时读取此秘密。在生产中,我们需要将这个秘密存储在环境变量中,而不是存储在文件中

在指南中,他们将秘密放在配置文件中。我希望该指南描述了为什么JWT秘密应该是一个环境变量而不是配置文件,但它非常模糊。那么,为什么秘密应该是环境变量,以及使用秘密的其他最佳实践是什么?我决定使用Passport&Express会话来进行身份验证,而不是JWT,但我认为它仍然适用于会话机密


我的下一个问题是如何在环境变量中设置一个秘密?我不再使用指南了,但是使用它的人如何将配置文件转换成环境变量呢?最后,在典型的Node.js应用程序中,您通常使用环境变量做什么?

为什么秘密应该是环境变量,而不是存储在配置文件中

在项目中工作时,您最终会将代码上传到github上,每个人都可以访问它。如果您将机密存储在配置文件中,任何拥有github帐户的人都可以读取,因此存在安全风险。将秘密存储为环境变量可确保其安全保存。配置文件应该从
process.env
对象中读取这些值。大概是这样的:

const jwtSecretKey = process.env.JWT_SECRET_KEY;
const googleApiKey = process.env.GOOGLE_API_KEY;
const serverPort = process.env.PORT || 8000; // 8000 is the default value in case if the env variable has not been set

module.exports = {
   jwtSecretKey: jwtSectetKey,
   googleApiKey: googleApiKey,
   serverPort: serverPort
}
使用这些秘密的任何其他代码都需要配置文件

const config = require('./config');
...

jwt.verify(token, config.jwtSecretKey);
除了将机密存储为环境变量外,还应将任何特定于环境的值存储为环境变量。例如,假设您的NodeJS服务器(连接到托管数据库)在三个环境中运行—开发、QA和PROD。这些环境中的每一个都有关于环境应连接到的DB主机和端口的不同信息。环境变量是在每个单独的环境中存储DB主机和端口,并在所有环境中使用相同的代码通过读取环境变量连接到不同的数据库的好方法


如何将这些值存储为环境变量——一种方法是手动存储,尽管我不推荐这样做。一种方法是使用shell脚本。这实际上取决于您的基础设施

回答得不错,我还将添加npm dotenv包的使用,当然还将*.env添加到.gitignore文件中,这样您就只有一个包含所有环境变量的文件。