Сброс пароля. Токен истекает каждый раз в стеке MEAN - PullRequest
1 голос
/ 15 октября 2019

Я новичок в стеке MEAN, работаю над забытым паролем и сбросил пароль. Я завершил забыл пароль переднего конца с Angular 8 и узла и экспресс. Письмо отправлено на электронную почту пользователя для сброса пароля. но всякий раз, когда я нажимаю на ссылку, указанную в почтовом сообщении, показывается "Срок действия токена"

forgot password node js:-

exports.forgot_password= function(req, res){
  async.waterfall([
    function(done) {
      crypto.randomBytes(20, function(err, buf) {
        var token = buf.toString('hex');
        done(err, token);
      });
    },
    function(token, done) {
      User.findOne({ userEmail: req.body.userEmail }, function(err, user) {
        if (!user) {
          return res.json({status:false, message:'E-Mail not Found'})
        }
        console.log('step 1')
        user.reset_password_token = token;
        user.reset_password_expaire = Date.now() + 3600000; // 1 hour

        user.save(function(err) {
        done(err,token, user);
         });
      });
    },
    function(token, user, done) {
        console.log('step 2')

      var smtpTrans = nodemailer.createTransport({
         service: 'Gmail',
         auth: {
          user: 'myemail',
          pass: 'mypass'
        }
      });
      console.log('step 3')

        smtpTrans.sendMail({
          from: 'myemail',
          to:user.userEmail,
          subject:'Password Reset',
          text:'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
            'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
            'http://' + req.headers.host + '/api/reset_password/' + token + '\n\n' +
            'If you did not request this, please ignore this email and your password will remain unchanged.\n',

        });
        console.log('Email Send');
}
  ], function(err) {
    console.log('this err' + ' ' + err)

  });
};

Reset Password

exports.reset_password= function(req, res,next) {
  console.log('Step 1');
  User.findOne({
  reset_password_token: req.body.token,
  reset_password_expires: {$gt: Date.now()}
})
.exec(function(err, user) {
  console.log ('step 2')

  if (!err && user) {
    if (req.body.userPassword === req.body.userConfPassword) {
      user.hash_password = bcrypt.hash(req.body.newPassword, 10);
      user.reset_password_token = undefined;
      user.reset_password_expires = undefined;
      user.save(function(err) {
        if (err) {
          return res.status(422).send({
            message: err
          });
        } else {
          var data = {
            to: user.userEmail,
            from: 'myemail',
            subject: 'Password Reset Confirmation',
            text: 'Hello,\n\n' +
            ' - This is a confirmation that the password for your account ' + user.userEmail + ' has just been changed.\n',
          };

          smtpTransport.sendMail(data, function(err) {
            if (!err) {
              return res.json({ message: 'Password reset' });
            } else {
              return done(err);
            }
          });
        }
      });
    } else {
      return res.status(422).send({
        message: 'Passwords do not match'
      });
    }
  } else {
    return res.status(400).send({
      message: 'Password reset token is invalid or has expired.'
    });
  }
});
};

node Routes

router.post('/forgot_password',forgot_password_Ctrl.forgot_password)

router.get('/reset_password/:token',reset_password_ctrl.reset_password)

Angular ROute

forgotpassword(value) {
    return this.http.post(`${this.uri}/forgot_password`, value);
  }

resetpassword(token) {
    return this.http.post(`${this.uri}/reset_password/${token}`, token);
  }

Schema

const mongoose = require("mongoose");
const Schema =  mongoose.Schema;

const User = new Schema({
  userName: String,
  userEmail: String,
  userPassword: {type: String,required: true, bcrypt: true},
  userConfPassword: String,
  userPhone: Number,
  userExperience: String,
  reset_password_token: String,
  reset_password_expaire: Date,
  new_user: String
});
const user = mongoose.model("user", User); //"user" is collections
module.exports= user;

...