【问题标题】:modify password with expressjs mongoose passport-local使用 expressjs mongoose passport-local 修改密码
【发布时间】:2014-07-21 01:24:04
【问题描述】:

首先,我是法国人,我的英语不是很好,我尽力了:)

我使用 PassportJs、Mongoose 和 Expressjs (v3.x) 创建了本地身份验证。 它完美地工作。当用户登录时,在 /account/ 空间中,我创建了一个表单来更改当前密码(3 个输入:pass、newpass、newpassconfirm)。但在那之后,我不知道如何处理......

我是否必须创建另一个护照 LocalStrategy 才能找到我的用户并调用在我的用户架构中声明的“setPassword”函数? 我可以在不使用 passportjs 的情况下执行此操作吗?如果可能,我怎样才能让我的用户访问数据库?

这是我的身份验证代码。

我的 /login POST (/routes/user.js)

app.post('/login', function(req, res, next) {
    passport.authenticate('local-login', function(err, user, info) {
        if (err) { 
            return next(err); 
        }

        if (!user) { 
            return res.redirect('/login'); 
        }

        req.logIn(user, function(err) {
            if (err) { 
                return next(err); 
            }

            req.session.pseudo = user.pseudo;
            return res.redirect('/');
        });
    })(req, res, next);
});

我的护照脚本 (/script/passport.js)

passport.use('local-login', new LocalStrategy({
    usernameField : 'pseudo',
    passwordField : 'pass',
    passReqToCallback : true // permet de passer l'objet req dans le callback
}, function (req, pseudo, pass, done) {
    Users.findOne({ 'pseudo': pseudo }, function (err, user) {
        if (err) { 
            return done(err); 
        }
        if (!user) { 
            return done(null, false, req.flash('loginMessage', 'Cet utilisateur n\'existe pas.'));
        }
        if (!user.verifyPassword(pass)) { 
            return done(null, false, req.flash('loginMessage', 'Mot de passe incorrect.')); 
        }
        return done(null, user);
    });
}));

我的用户架构 (/models/db_Users.js)

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');

// Schema de la collection User
var usersSchema = mongoose.Schema({
    pseudo: String,
    pass: String,
    admin: Boolean,
}, 
{
    collection: 'Users' 
});

usersSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

usersSchema.methods.verifyPassword = function(password) {
    return bcrypt.compareSync(password, this.pass);
};

module.exports = mongoose.model('Users', usersSchema);

我遇到问题的 /changepass POST (/routes/users.js)

app.post('/changepass' , function (req, res, next) {
    //console.log(req.body.pass, req.body.newpass, req.body.newpassconfirm);

    // Should I call another passport LocalStrategy to acces to my User and set the new password here ?

    res.redirect('/account');
});

如果您对我的应用程序的结构有疑问,可以在这里找到所有项目:https://github.com/tibaldev/docu

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    /models/db_Users.js

    // bcrypt middleware
    usersSchema.pre('save', function(next){
        var user = this;
    
        //check if password is modified, else no need to do anything
        if (!user.isModified('pass')) {
           return next()
        }
    
        user.pass = bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        next()
    })
    

    在你的 routes/users.js 中

    var User = require('mongoose').model('Users')
    
    app.post('/changepass' , function (req, res, next) {
         if (newpass !== newpassconfirm) {
            throw new Error('password and confirm password do not match');
         }
    
         var user = req.user;
    
         user.pass = newpass;
    
         user.save(function(err){
             if (err) { next(err) }
             else {
                 res.redirect('/account');
             }
         })
    });
    

    【讨论】:

    • 在您的 userSchema.pre 中有一个错字:user.pass = bcrypt.hashSync(user.password, bcrypt.genSaltSync(8), null);
    • 这给出了重复密钥错误(我不知道如何更新现有帐户)。
    • 谢谢你,它帮助了我。
    【解决方案2】:

    你可以试试这样的

    app.post("/update/userid", function(req, res) {
        var userid = req.params.id
        var username = req.session.passport.user
        var newPass = req.body.password
        console.log(username, userid)
        User.findByUsername(username).then(function(sanitizedUser) {
            if (sanitizedUser) {
                sanitizedUser.setPassword(newPass, function() {
                    sanitizedUser.save();
                    res.send('password reset successful');
                });
            } else {
                res.send('user does not exist');
            }
        }, function(err) {
            console.error(err);
        })
    })
    

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2017-09-25
      • 2022-07-30
      • 1970-01-01
      • 2018-11-07
      • 2021-08-15
      • 1970-01-01
      • 2021-10-13
      • 2013-09-26
      相关资源
      最近更新 更多