说明我有一个包含电子邮件和密码组合的数组,即:
["[email protected]", "johnspasswordhashhere", "[email protected]", "janetpasswordhashhere", "[email protected]", "timspasswordhashhere" ]
我如何比较提供的电子邮件和密码哈希是否匹配?我需要使用bcrypt.compare(passtotestvar, passhash)
进行比较。
您可以首先对用户和密码进行排序,然后遍历每个用户以检查凭据
const arr = ["[email protected]", "johnspasswordhashhere", "[email protected]", "janetpasswordhashhere", "[email protected]", "timspasswordhashhere"]
const sorted = arr.reduce((a, e, i) => (i % 2 || a.push([]), a[a.length - 1].push(e), a), [])
console.log(sorted)
然后您可以使用bcrypt的比较功能,该功能可以为您完成所有工作:
// from DB
const users = {
'[email protected]': 'HASHEDPW',
'[email protected]': 'HASHEDPW',
'[email protected]': 'HASHEDPW'
}
sorted.forEach(([email, password]) => {
bcrypt.compare(password, users[email]).then((e, r) => {
// r = true if hash = hashed pw
})
})
我想您正在尝试使用电子邮件和密码登录用户。
如果是这样,您首先需要找到具有给定电子邮件的用户,然后将user.password与请求正文中的密码进行比较。
示例登录注册簿可以像这样:
app.post("/api/login", async (req, res) => {
const { email, password } = req.body;
try {
let user = await User.findOne({ email });
if (!user) return res.status(400).send("Invalid email or password.");
const validPassword = await bcrypt.compare(password, user.password);
if (!validPassword)
return res.status(400).send("Invalid email or password.");
//todo you can create a token and return
res.json({ result: true });
res.send(token);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});