Bcrypt 密码比较不起作用。 user.password 在 Node.js Express App 中甚至是空的
Bcrypt password comparison doesn't work. Even user.password is empty in Node.js Express App
我正在使用 Node.js Express App 学习 MongoDB。
我正在使用 Bcrypt 保护我的密码。 mongodb 中的加密和保存是成功的,但是当我尝试比较 SigIn 的密码时,它只是失败了。
SignUp route
router.post('/signUp', (req, res, next) => {
let userData = req.body;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
bcrypt.hash(userData.password, saltRounds, function (err, hash) {
User.create({
name: userData.name,
fname:userData.fname,
email:userData.email,
password:hash
}).then(() => {
//success callback
res.send('Saved');
}).catch(next);
});
});
});
SignIn route
router.post('/signIn', (req, res) => {
const incomingEmail = req.body.email;
const incomingPassword = req.body.password;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
User.find({incomingEmail}).then((user) => {
if (user.length > 0) {
bcrypt.compare(incomingPassword, user.password).then(function (result) {
res.status(200).json({status: 200, data: user[0]});
}).catch(() => {
res.send('incorrect password')
});
} else {
res.status(404).json({status: 404, data: 'User not found'});
}
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
});
});
使用有效的登录凭据显示
{"status": 404, "data": "User not found" }
如果电子邮件匹配,即使我尝试只发送密码,仍然 returns 什么都没有。
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
我在 Windows 10.
上使用 WebStorm
节点版本是11.12.0
项目package.json
"dependencies": {
"bcrypt": "3.0.4",
"body-parser": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"mongodb": "^3.1.13",
"mongoose": "^5.4.17",
"mongoose-unique-validator": "^2.0.2",
"morgan": "~1.9.0"
}
如果有人有答案请告诉我。谢谢
您的代码没有任何问题。我已经在我这边测试过了。我看到的唯一异常是在发送响应时您有一个响应数组,但将其作为单个对象读取。
以上是我说的行话的意思
代替
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
这样做
User.find({incomingEmail}).then((user) => {
res.send(user[0].password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
OR IN ANOTHER CASE
我可以看到您可以做的是不使用 MONGOOSE ONLY FIND 方法!您也可以使用 FINDONE 方法,这样它就不需要为单个用户读出 JSON 响应数组。 FINDONE 将帮助您使用已有的代码。
我正在使用 Node.js Express App 学习 MongoDB。 我正在使用 Bcrypt 保护我的密码。 mongodb 中的加密和保存是成功的,但是当我尝试比较 SigIn 的密码时,它只是失败了。
SignUp route
router.post('/signUp', (req, res, next) => {
let userData = req.body;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
bcrypt.hash(userData.password, saltRounds, function (err, hash) {
User.create({
name: userData.name,
fname:userData.fname,
email:userData.email,
password:hash
}).then(() => {
//success callback
res.send('Saved');
}).catch(next);
});
});
});
SignIn route
router.post('/signIn', (req, res) => {
const incomingEmail = req.body.email;
const incomingPassword = req.body.password;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
User.find({incomingEmail}).then((user) => {
if (user.length > 0) {
bcrypt.compare(incomingPassword, user.password).then(function (result) {
res.status(200).json({status: 200, data: user[0]});
}).catch(() => {
res.send('incorrect password')
});
} else {
res.status(404).json({status: 404, data: 'User not found'});
}
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
});
});
使用有效的登录凭据显示
{"status": 404, "data": "User not found" }
如果电子邮件匹配,即使我尝试只发送密码,仍然 returns 什么都没有。
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
我在 Windows 10.
上使用 WebStorm节点版本是11.12.0
项目package.json
"dependencies": {
"bcrypt": "3.0.4",
"body-parser": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"mongodb": "^3.1.13",
"mongoose": "^5.4.17",
"mongoose-unique-validator": "^2.0.2",
"morgan": "~1.9.0"
}
如果有人有答案请告诉我。谢谢
您的代码没有任何问题。我已经在我这边测试过了。我看到的唯一异常是在发送响应时您有一个响应数组,但将其作为单个对象读取。
以上是我说的行话的意思
代替
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
这样做
User.find({incomingEmail}).then((user) => {
res.send(user[0].password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
OR IN ANOTHER CASE
我可以看到您可以做的是不使用 MONGOOSE ONLY FIND 方法!您也可以使用 FINDONE 方法,这样它就不需要为单个用户读出 JSON 响应数组。 FINDONE 将帮助您使用已有的代码。