Node.js NodeJS,Passport:如何更改用户';管理员输入的密码
我开始为修改用户创建管理面板。我想有能力改变管理员用户密码。我使用passport进行身份验证。我更改了用户的密码-数据正在保存到mongo,但在此之后,用户无法登录到该站点。 请帮忙 我的Passport配置:Node.js NodeJS,Passport:如何更改用户';管理员输入的密码,node.js,mongodb,authentication,passport.js,Node.js,Mongodb,Authentication,Passport.js,我开始为修改用户创建管理面板。我想有能力改变管理员用户密码。我使用passport进行身份验证。我更改了用户的密码-数据正在保存到mongo,但在此之后,用户无法登录到该站点。 请帮忙 我的Passport配置: module.exports = function(passport) { passport.serializeUser(function(user, done) { done(null, user.id) }); passport.dese
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
done(null, user.id)
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use('local-login', new LocalStrategy({
usernameField : 'email',
passwordField : 'password_first',
passReqToCallback : true
},
function(req, email, password, done) {
User.findOne({ 'email' : email }, function(err, user) {
if (err)
return done(err);
if (!user)
return done(null, false, function(req, res){
res.send({error: true})
});
if (!user.isAuthenticated )
return done(null, false, function(req, res){
res.send({error: true})
});
if (!user.validPassword(password))
return done(null, false, function(req, res){
res.send({error: true})
});
if(user){
return done(null, user);
}
});
}));
用户模型:
var userSchema = mongoose.Schema({
date : Date,
role : String,
newRole : { type: mongoose.Schema.Types.ObjectId, ref: 'newRole'},
authToken : { type: String, required : true, unique:true },
isAuthenticated : { type: Boolean, required : true },
username : String,
email : String,
password_first : String,
firstName : String,
lastName : String,
address : String,
phone : String,
resetPasswordToken : String,
resetPasswordExpires: Date });
Methods:
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.password_first);
};
var User = mongoose.model('User', userSchema);
module.exports = User;
最后:
exports.changeByAdmin = function (req, res, next) {
User.findById({ _id : req.params.id }, function(err, updateUser) {
if(err) return next(err);
if (!updateUser) return next();
updateUser.email = req.body.email;
updateUser.firstName = req.body.firstName;
updateUser.lastName = req.body.lastName;
updateUser.address = req.body.address;
updateUser.phone = req.body.phone;
updateUser.password_first = updateUser.generateHash(req.body.password_first);
updateUser.save(function(err, updateUser) {
if(err) return next(err);
if(!updateUser) return next();
res.send({ success: true });
});
});
};
如果我只更改用户的电子邮件,用户可以使用新电子邮件和旧密码登录,但如果我更改密码-用户无法登录。请告诉我这个问题的解决办法。谢谢。这是您的完整用户模型吗?是否有一个预保存钩子在某个地方再次散列密码?@Kryten正在
changeByAdmin
中(手动)执行此操作。它到底在哪里失败?当用户尝试登录时,validPassword
是否失败?数据库中的用户文档是否已正确更新?在保存之前,updateUser.password\u是否有意义?等等,@robertklep在updateUser.save()
之后,数据库中的用户文档被更新,数据库中的第一个密码正在更改,但我尝试登录,validPassword()
失败。我认为问题出在passport中,可能是我只能为会话中的用户更改密码?请尝试查看是否可以根据独立代码中的新密码验证生成的哈希。这是您的完整用户模型吗?是否有一个预保存钩子在某个地方再次散列密码?@Kryten正在changeByAdmin
中(手动)执行此操作。它到底在哪里失败?当用户尝试登录时,validPassword
是否失败?数据库中的用户文档是否已正确更新?在保存之前,updateUser.password\u是否有意义?等等,@robertklep在updateUser.save()
之后,数据库中的用户文档被更新,数据库中的第一个密码正在更改,但我尝试登录,validPassword()
失败。我认为问题出在passport中,可能是我只能为会话中的用户更改密码?请尝试查看是否可以根据独立代码中的新密码验证生成的哈希。