【问题标题】:passport-local-mongoose set new password after checking for old password护照本地猫鼬检查旧密码后设置新密码
【发布时间】:2018-01-20 11:09:19
【问题描述】:

我正在使用 passportjs 来处理我的应用程序的身份验证。 用户登录后,我想添加从应用程序内部更改密码的可能性。

这是在我的控制器中:

$http.post('/change-my-password',{oldPassword: $scope.user.oldpassword, newPassword: $scope.user.newpassword})
    .then(function (res) {
        if (res.data.success) {
            // password has been changed.
        } else {
            // old password was wrong.
        }
    });

这是我在后端 express nodejs 中的路由处理程序:

router.post('/change-my-password', function (req, res) {
    if (!req.isAuthenticated()) {
        return res.status(403).json({
            success: false
        });
    }
    UserSchema.findById(req.user._id, function(err, user){
        if (err) return res.status(200).json({success: false});

        user.validatePassword(req.body.oldPassword, function(err) {

            if (err){
                return res.status(200).json({
                    success: false
                });
            }

            user.setPassword(req.body.newPassword, function() {
                if (err || !user) {
                    return res.status(200).json(
                        {
                            success: false
                        }
                    )
                }

                user.save(function(err) {
                    if (err) return res.status(200).json({success: false});

                    req.login(user, function (err) {
                        if (err) return res.status(200).json({success: false});
                        return res.status(200).json({success: true});
                    });

                });
            });


        });


    });
});   

这是我的用户模式模型:

// user model
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var bcrypt = require('bcrypt-nodejs');

var UserSchema = new Schema({
    email: String,
    password: String,
    confirmStatus: Boolean,
    token: String,
    registerAt: Number
});

UserSchema.methods.validatePassword = function (password, callback) {
    this.authenticate(password, callback);
};


UserSchema.plugin(passportLocalMongoose,
    {
        usernameField: 'email'
    });

module.exports = mongoose.model('users', UserSchema);

问题:

我在我的猫鼬模式UserSchema 中通过 ID 找到我的用户,然后我应该检查oldPassword 是否有效,然后我设置新密码。
我成功找到用户并设置了新密码。但是应该检查旧密码字段比较的部分根本不起作用。我在旧密码字段中输入的任何内容都被接受为 OK,并且该步骤被跳过。然而,它应该会抛出一个错误,说明旧密码错误。


还建议我使用 sanitizedUser 以免显示我的盐等。

问题是:如何先进行旧密码的比对检查,再进行设置新密码的步骤?如果可能,我该如何使用消毒剂?以及如何检查用户输入的密码是否与新密码相同?或者如果可能的话,说新密码与旧密码非常相似?

【问题讨论】:

    标签: node.js express mongoose passport.js change-password


    【解决方案1】:

    您可以使用the new feature added 3 days ago 来实现它:

    只需使用changePassword method,它就会通过以下方式处理它:

    schema.methods.changePassword = function(oldPassword, newPassword, cb) {
        if (!oldPassword || !newPassword) {
          return cb(new errors.MissingPasswordError(options.errorMessages.MissingPasswordError));
        }
    
        var self = this;
    
        this.authenticate(oldPassword, function(err, authenticated) {
          if (err) { return cb(err); }
    
          if (!authenticated) {
            return cb(new errors.IncorrectPasswordError(options.errorMessages.IncorrectPasswordError));
          }
    
          self.setPassword(newPassword, function(setPasswordErr, user) {
            if (setPasswordErr) { return cb(setPasswordErr); }
    
            self.save(function(saveErr) {
              if (saveErr) { return cb(saveErr); }
    
              cb(null, user);
            });
          });
        });
      };
    

    所以在您的代码中,您需要将 validatePassword 方法替换为:

    user.changePassword(req.body.oldPassword,req.body.newPassword, function(err) {
    
                if (err){
                    return res.status(200).json({
                        success: false
                    });
                }
    

    希望这对你有用。

    【讨论】:

    • 我知道这是旧的,但 User.changePassword 对我不起作用,我必须使用 User.schema.methods.changePassword
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2019-12-05
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多