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
通过这些方法,您可以灵活且安全地管理密钥,让整个流程变得简单高效。