Node.js: 管理密钥信息
如何使用 Node.js 管理密钥信息
👋 欢迎使用 Stackhero 文档!
Stackhero 提供现成的 Node.js 云 解决方案,具有众多优势,包括:
- 通过简单的
git push在几秒钟内 部署您的应用程序。- 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
- 享受自动备份、一键更新以及简单、透明和可预测的定价带来的安心。
- 通过专用私有 VM获得最佳的性能和强大的安全性。
节省时间并简化您的生活:只需 5 分钟即可试用 Stackhero 的 Node.js 云托管 解决方案!
当您的 Node.js 项目需要与数据库、对象存储或外部 API 交互时,安全地存储凭证(如用户名、密码或令牌)非常重要。这些凭证通常被称为“密钥信息”(secrets)。保护您的密钥信息的机密性对于保障应用程序的安全至关重要。
您可能会想要这样做
一开始,您可能会考虑直接在代码中写入凭证,例如:
// 连接到 PostgreSQL 数据库
const pg = new Client({
host: '<XXXXXX>.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
然而,这种做法并不安全。因为您的密钥信息很容易被提交到 Git 仓库,任何有权限的人都能看到。即使您认为只有自己有访问权限,这也类似于把写有密码的便签贴在显示器上,希望没人注意到。最终,这可能导致严重的安全问题。
此外,将密钥信息硬编码在代码中,会让开发和生产等不同环境的管理变得非常困难。
环境变量
业界普遍推荐的最佳实践是将密钥信息存储在环境变量中。
环境变量是在代码之外定义的,并且在 Node.js 启动前设置。这样,所有密钥信息都通过环境变量定义,永远不会被硬编码到应用程序中。
定义您的第一个环境变量
您可以在启动 Node.js 命令时设置环境变量,例如:
MY_PASSWORD=myDevelopmentPassword node app.js
此命令会创建一个名为 MY_PASSWORD 的变量,值为 myDevelopmentPassword。格式很简单:<KEY>=<value>。
按照惯例,环境变量通常使用大写字母。需要注意的是,环境变量只能存储字符串,不能存储数组或对象。
读取环境变量
在您的 app.js 文件中,可以通过 process.env 访问环境变量,例如:
console.log(process.env.MY_PASSWORD);
这将输出 myDevelopmentPassword。
现在,您的密码已经定义在代码之外,这有助于避免其意外进入 Git 仓库。
如果您在生产环境中使用 Stackhero,可以直接在 Node.js 服务的控制台中定义名为 MY_PASSWORD 的新环境变量,值为 myProductionPassword。这样可以轻松地在不同环境之间切换。
Stackhero 控制台上的 Node.js 配置示例
通过这种方式,您的密码不再存储在代码中,并且可以为开发和生产环境分别使用不同的凭证。
使用 dotenv 库
在实际项目中,通常需要管理多个密钥信息。例如,连接数据库时,可能需要主机名、用户名和密码。
管理单个密钥信息很简单,但如果有多个,手动维护会变得很繁琐。想象一下用如下命令启动应用:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
这样很快就会变得难以阅读和维护。在生产环境中,变量可能更多,这种方式就不太可行了。
这时,dotenv 库就能派上用场。
使用 dotenv,您可以将密钥信息存储在一个名为 .env 的独立文件中。
首先,您可以通过以下命令安装 dotenv 库:
npm install dotenv
接下来,创建一个 .env 文件来存放您的变量:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
为了保证密钥信息安全,请确保 .env 文件不会被加入到 Git 仓库。可以通过将其添加到 .gitignore 文件来实现:
echo ".env" >> .gitignore
最后,在 app.js 文件顶部加载 dotenv 库:
require("dotenv").config();
这样配置后,当您在开发环境中使用 node app.js 启动应用时,dotenv 会自动读取 .env 文件。在生产环境中,无需 .env 文件,环境变量会直接从 Node.js 服务配置中获取,您可以通过 Stackhero 控制台进行管理。
实用示例
理论讲完了,下面来看一个实际的例子。
您可以在这里找到完整的示例:https://github.com/stackhero-io/dotenvWithNodejs
通过这些方法,您可以灵活且安全地管理密钥信息,让整个流程变得简单高效。