我正在为我的应用程序创建管理员凭据,该模型非常简单,它具有用户名和密码属性以及一些验证。我有一个函数,可以在其中向数据库填充一些信息。
async function init() {
const admin = new Admin({
username: "admin",
password: "12345"
});
const salt = await bcrypt.genSalt(10);
admin.password = await bcrypt.hash(admin.password, salt);
try {
await admin.save({ username: admin.username });
} catch (ex) {
console.log(ex.message);
}
}
但是,通过这种方法,我将密码保存在源代码中,但我不希望这样。我当时在想,我可以使用config
软件包将管理员密码存储在环境变量中。
我尝试了以下操作:
创建了一个default.json文件:
{ "adminPassword": "" }
创建了一个custom-environment-variables.json文件:
{ "adminPassword": "fifteen_adminPassword" }
然后将我的代码修改为此:
const admin = new Admin({
username: "admin",
password: config.get("adminPassword")
});
最后,我设置了环境变量export fifteen_adminPassword=12345
,但是在进行身份验证时,此操作失败,因为密码无效。
答案 0 :(得分:0)
我以前使用过 config 软件包,但我太头疼了。所以我切换到 env-cmd 软件包。这是您应如何实施:
npm install env-cmd
然后在您的根文件夹中创建一个/ config目录。在其中创建一个dev.env文件。像这样在这里输入变量
/config/dev.env
PORT=3000
ADMIN_PASSWORD=fifteeen_adminpassword
请注意,对于命名约定,env变量始终为大写字母,我们用“ _”分隔。和值不是字符串。
现在您需要配置package.json文件。在“脚本”中,我们通常具有启动,开发,测试脚本。开始是针对我们当前的开发环境的部署平台,测试进行测试以及开发。如果您使用的是nodemon(很可能是您),则开发脚本应该是这样的。
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
当您运行npm run dev
时,终端将运行此nodemon src/index.js
。这是任何节点应用程序的基本配置。现在我们需要传递存储在/config/dev.env中的变量。到我们的应用程序。将此“ dev”更改为
"dev": "env-cmd -f ./config/dev.env nodemon src/index.js",
现在env-cmd软件包将您传递给/config/dev.env的所有变量设置为环境变量。现在您可以像这样使用它们:
const admin = new Admin({
username: "admin",
password: process.env.ADMIN_PASSWORD
});
注意,将项目部署到github时,已将配置文件夹名称添加到.gitignore文件。因此您的密码或api密钥将不会公开。
每当您向dev.env中添加新变量时,终止终端进程并重新发送。 mongodb将给出错误。
答案 1 :(得分:0)
您已经在对密码进行哈希处理,因此不再需要明文形式的密码。为什么以后要全部存储明文密码?
为什么不只将哈希密码存储在您的代码中(由于不灵活,它可能不太好)或某些配置文件中? 除了introducing more risks以外,我看不到环境变量会给密码带来什么好处。
如果您的应用程序需要凭据才能登录到任何服务,并且您不能保留密码哈希(例如,因为您需要使用真实密码登录),则需要存储透明文本密码。如果您正在设计用户管理并控制登录机制,则很可能不需要存储明文密码,而可以存储哈希并将其用于登录。
如果您仍要存储明文密码,则应尝试将其存储在安全的位置(环境变量不是安全的位置)。 您可以:
~/.ssh/
目录,该目录仅供用户读取)。请注意,这只是安全的一小部分,但却提供了最大的舒适感