Javascript 使用bcrypt获取有效密码
我正在使用nodejs和sequelize来设置我的数据库,目前我正在尝试对我的密码进行哈希和盐渍处理,我已经进行了哈希处理,但是现在当我要登录时,我想将密码send in req.body与哈希处理后的密码进行比较,所以我这样做了:Javascript 使用bcrypt获取有效密码,javascript,node.js,postgresql,express,sequelize.js,Javascript,Node.js,Postgresql,Express,Sequelize.js,我正在使用nodejs和sequelize来设置我的数据库,目前我正在尝试对我的密码进行哈希和盐渍处理,我已经进行了哈希处理,但是现在当我要登录时,我想将密码send in req.body与哈希处理后的密码进行比较,所以我这样做了: router.post('/', function (req, res, next) { console.log("hi"); if (JSON.stringify(req.body) == "{}") { return res.status(40
router.post('/', function (req, res, next) {
console.log("hi");
if (JSON.stringify(req.body) == "{}") {
return res.status(400).json({ Error: "Login request body is empty" });
}
if (!req.body.username || !req.body.password) {
return res.status(400).json({ Error: "Missing fields for login" });
}
var password = User.validPassword(req.body.password);
// search a user to login
User.findOne({ where: { username: req.body.username, password: password } }) // searching a user with the same username and password sended in req.body
.then(function (user) {
if (!user) {
return res.status(400).json({ Error: "There is no user with those fields" }); // if there is no user with specific fields send
}
return res.status(400).json({ Error: "loged in!" }); // username and password match
}).catch(function (err) {
return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
});
});
我的模型是这样的:
"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
module.exports = function (sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
classMethods: {
generateHash: function (password) {
console.log("hi");
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
},
validPassword: function (password) {
return bcrypt.compareSync(password, this.password);
}
}
});
return User;
}
我没有得到任何回应
var password = User.validPassword(req.body.password);
我尝试了console.log,但仍然没有响应,当我尝试转到路由器/登录时,它没有给我任何它一直在加载的响应,任何建议?首先,您的路由定义了一个到
/
而不是/login
的post操作。如果你还没有前端,你可以用邮递员来试试
validPassword方法应该在用户模型的实例上调用,因此您应该像这样编写这部分代码
router.post('/', function (req, res, next) {
console.log("hi");
if (JSON.stringify(req.body) == "{}") {
return res.status(400).json({ Error: "Login request body is empty" });
}
if (!req.body.username || !req.body.password) {
return res.status(400).json({ Error: "Missing fields for login" });
}
// search a user to login
User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body
.then(function (user) {
if(user && user.validPassword(req.body.password)) {
return res.status(200).json({message: "login successful"});
} else {
return res.status(401).json({message: "Unauthorized"});
}
}).catch(function (err) {
return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
});
});
同样在catch方法中,状态代码应该是描述内部服务器错误的代码,如
500
200不合适。在Femi Oladeji的帮助下,我似乎可以回答我自己的问题,基本上这个问题与我想通过实例而不是模型来访问方法有关
因此,当我尝试使用用户实例访问它时,没有处理实例的方法,所以对我的模型做了一些更改
"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
module.exports = function (sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
classMethods: {
generateHash: function (password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
},
},
instanceMethods: {
validPassword: function (password) {
console.log(password, this.password)
return bcrypt.compareSync(password, this.password);
}
}
});
return User;
}
还有instanceMethods,它可以处理实例:)仍然不工作,/in路由是因为我使用了app.use登录控制台上的“hi”我总是收到服务器错误,我传递用户名和密码我认为用户validatepassword工作不正常:/你能做一个console.log吗(password,this.password)
方法内部感谢您的回答。注意,“I”在英语中始终是大写。在sequelize的V4中,类方法和实例方法被弃用,取而代之的是User.prototype.validPassword=function(){}和User.associate=function(){}--请参阅此处的文档: