【发布时间】: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