为什么在MEAN STACK中会自动显示密码和Salt?

时间:2016-07-16 10:40:53

标签: node.js express mongoose mean-stack meanjs

这里我试图验证用户模块中的手机号码。我已创建令牌并将其发送给用户,但每当用户尝试使用该特定令牌验证时,“密码”和“盐”会自动更改。怎么避免这个?有人帮我解决..在这里我只想更新

user.Mobileverification = 'verfied';
user.Mobileverificationcode = undefined;
user.mobileVerificationExpires = undefined;

以上三个变量发生了变化,但我不知道密码和盐为什么会发生变化?

我在下面给出了我的路线:

app.route('/auth/mobilereset/:token').get(users.mobileresetResetToken);
app.route('/auth/mobilereset/:token').post(users.mobilereset);

控制器:

exports.mobileresetResetToken = function(req, res) {
    User.findOne({
        Mobileverificationcode :req.params.token,
        mobileVerificationExpires: {
            $gt: Date.now()
         }
        // resetPasswordToken: req.params.token,
        // resetPasswordExpires: {
            // $gt: Date.now()
        // }
    }, function(err, user) {
        if (!user) {
            res.send({
                message: 'Invalid token'
            });


        } else {

            console.log('working fine');
        }
    });
};



exports.mobilereset = function(req, res, next) {


    async.waterfall([

        function(done) {
            User.findOne({
                Mobileverificationcode: req.params.token,
                mobileVerificationExpires: {
                    $gt: Date.now()
                }
            }, function(err, user) {
                if (!err && user) {

                        user.Mobileverification = 'verfied';
                        user.Mobileverificationcode = undefined;
                        user.mobileVerificationExpires = undefined;

                        user.save(function(err) {
                            if (err) {
                                return res.status(400).send({
                                    message: errorHandler.getErrorMessage(err)
                                });
                            } else {
                                req.login(user, function(err) {
                                    if (err) {
                                        res.status(400).send(err);
                                    } else {
                                        // Return authenticated user 
                                        res.json(user);

                                        done(err, user);
                                    }
                                });
                            }
                        });

                } else {
                    return res.status(400).send({
                        message: 'reset token is invalid or has expired.'
                    });
                }
            });
        },

    ], function(err) {
        if (err) return next(err);
    });
};

模型:

var UserSchema = new Schema({

    username: {
        type: String,
        unique: 'testing error message',
        required: 'Please fill in a username',
        trim: true
    },
    password: {
        type: String,
        default: '',
        // validate: [validateLocalStrategyPassword, 'Password should be longer']
    },
    email: {
        type: String,
        trim: true,
        default: '',
        // validate: [validateLocalStrategyProperty, 'Please fill in your email'],
        // match: [/.+\@.+\..+/, 'Please fill a valid email address']
    },
    Mobilenumber: {
        type: String,
        default: ''
    },


    roles: {
        type: [{
            type: String,
            enum: ['user', 'admin']
        }],
        default: ['user']
    },
    salt: {
        type: String
    },
    provider: {
        type: String,
        required: 'Provider is required'
    },
    providerData: {},
    additionalProvidersData: {},

    updated: {
        type: Date
    },
    created: {
        type: Date,
        default: Date.now
    },
    /* For reset password */
    Mobileverificationcode: {
        type: String,
    },
    mobileVerificationExpires: {
        type: Date
    },
    Mobileverification: {
        type: String,
        trim: true,
        default: 'Not Verified',
    },
    resetPasswordToken: {
        type: String
    },
    resetPasswordExpires: {
        type: Date
    }
});

1 个答案:

答案 0 :(得分:0)

我不知道你是否删除了这个,但在MEAN.js用户模型中,你必须小心使用以下代码块:

/**
 * Hook a pre save method to hash the password
 */
UserSchema.pre('save', function (next) {
   if (this.password && this.isModified('password')) {
     this.salt = crypto.randomBytes(16).toString('base64');
    this.password = this.hashPassword(this.password);
   }

  next();
});

在保存用户数据之前会调用它。这可能是密码和盐不断变化的原因......你在mobile.reset()中调用user.save,上面的代码块仍然存在。

<强>更新 可行的方法是:

/**
 * Hook a pre save method to hash the password
 */
UserSchema.pre('save', function (next) {
   if(!this.isModified('Mobileverification') && !this.isModified('Mobileverificationcode') && !this.isModified('mobileVerificationExpires')) {
       if (this.password && this.isModified('password')) {
         this.salt = crypto.randomBytes(16).toString('base64');
         this.password = this.hashPassword(this.password);
       }
    }

  next();
});

然而,可能需要进行一些调整,例如根据您的需要改进此预保存挂钩并测试密码更改和移动验证,以确定是否有任何损坏。