NodeJS,Passport:如何通过管理员更改用户的密码

时间:2017-04-18 14:12:07

标签: node.js mongodb authentication passport.js

我开始为修改用户制作管理面板。我希望能够通过管理员更改用户密码。对于身份验证我使用护照。我更改了用户的密码 - 数据保存到mongo,但之后,用户无法登录到网站。 请帮忙。

我的Passport配置:

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 });
        });
    });
};

如果我只更改用户的电子邮件,则用户可以使用新的电子邮件和旧密码登录,但如果我更改密码 - 用户无法登录。请告知解决此问题的方法。谢谢。

0 个答案:

没有答案