首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过passport认证和passport-local包在nodejs中添加‘更改密码’功能?

如何通过passport认证和passport-local包在nodejs中添加‘更改密码’功能?
EN

Stack Overflow用户
提问于 2020-10-28 17:36:45
回答 1查看 212关注 0票数 0

这是我放在passport.js中的authentication passport代码

代码语言:javascript
复制
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

passport.serializeUser(function (user, done) {
  done(null, user._id);
});

passport.deserializeUser(function (id, done) {
  User.findOne({_id: id}, function (err, user) {
    done(err, user);
  })
});

passport.use(new LocalStrategy({
    usernameField: 'email'
  },
  function (username, password, done) {
    User.findOne({email: username}, function (err, user) {
      if (err) return done(err);
      if (!user) {
        return done(null, false, {
          message: 'Incorrect username or password'
        });
      }
      if (!user.validPassword(password)) {
        return done(null, false, {
          message: 'Incorrect username or password'
        });
      }

      return done(null, user);
    })
  }
));

这是我使用mongoose查询在mongoDB中以salthash形式存储密码的Schema code

代码语言:javascript
复制
var mongoose = require('mongoose');
var crypto = require('crypto');

var userSchema = new mongoose.Schema({
  email: {
    type: String,
    unique: true,
    required: true
  },
  name: {
    type: String,
    required: true
  },

  hash: String,
  salt: String
 
});

userSchema.methods.setPassword = function(password) {
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha1').toString('hex');
};

userSchema.methods.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha1').toString('hex');
  return this.hash === hash;
};

module.exports = mongoose.model('User', userSchema);

这是Login路由的auth.js代码:

代码语言:javascript
复制
   var express = require('express');
    var router = express.Router();
    var passport = require('passport');
    var mkdirp = require('mkdirp');
    
    var nodemailer = require('nodemailer');
    var config = require('../config');
    var transporter = nodemailer.createTransport(config.mailer);
    
    
    
    router.route('/login')
      .get(function(req, res, next) {
        res.render('login', { title: 'Login your account'});
      })
      .post(passport.authenticate('local', {
        failureRedirect: '/login'
      }), function (req, res) {
      res.redirect('/profile');
})

下面是我正在尝试executepassword change route,它可能无法工作。我认为,当用户成功更改密码时,我需要将hashsalt值更新到数据库中,而我不知道如何才能做到这一点。请帮帮忙!

代码语言:javascript
复制
 router.post('/api/changePassword', function(req,res,next){
      req.checkBody('oldPass', 'Empty Password').notEmpty();
      req.checkBody('newPass', 'Password do not match').equals(req.body.confirmPass).notEmpty();

      var errors = req.validationErrors();
      if (errors) {
        console.log("Errors hain bhai");
        console.log(errors);
        res.render('settingsClient', {
          oldPass: req.body.oldPass,
          newPass: req.body.newPass,
          confirmPass:req.body.confirmPass,
          errorMessages: errors
        });
      }
      else {

       User.findOne({id: req.user.id}, function (err, data) {
         console.log("came inside api changePassword else condition inside User.findOne");
         if (err) {
          console.log(err);
         }
         else {
       data.setPassword(req.body.newPass, function(err,datas){
         if(datas) {
         data.save(function (err,datass) {
          if (err) {
            res.render('settingsClient', {errorMessages: err});
          } else {
            console.log("Hash and Salt saved");
          }
        });
      }
      else {
        console.log("setPassword error"+ err);
      }
       });
    }
      })
    }
    })

不工作/不更新数据库中的密码值。我可能正在做的可能的原因和错误是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-10-28 18:20:38

嗯!因此,我从setPassword中删除了回调函数,并尝试使用promises的方式/路由来解决这个问题:我在这里发布了解决方案,现在运行良好。

代码语言:javascript
复制
 User.findOne(userObj).then(function(sanitizedUser) {
               if (sanitizedUser) {
                 console.log("sanitizedUser.hash = "+ sanitizedUser.hash);
                   sanitizedUser.setPassword(req.body.newPass);
                       console.log("Password going to be changed successfully now")
                       sanitizedUser.save(function (err,data) {
                         if (err) {
                           res.render('register', {errorMessages: err});
                         } else {
                           console.log("Password changed successfully");
                           res.send('Password reset successful');
                         }
                       });

               } else {
                   res.send('user does not exist');
               }
           }, function(err) {
               console.error(err);
           });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64570077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档