сброс пароля не работает, он отправляет письмо с подтверждением, но не сбрасывает пароль на измененный - PullRequest
0 голосов
/ 27 января 2020

когда я запрашиваю смену пароля, я получаю письмо с подтверждением того, что ваш пароль был изменен, но когда я пытаюсь войти в систему, пароль не работает.

маршрут пользователя


    const express = require('express');
    const router = express.Router();
    const bcrypt = require('bcryptjs');
    const passport = require('passport');
    const async = require("async");
    const nodemailer = require("nodemailer");
    const crypto = require("crypto");
    const Mail = require('../models/Mail1');
    const Smtp = require('../models/Mail');



    // Load User model
    const User = require('../models/User');
    const { forwardAuthenticated } = require('../config/auth');

    // Login Page
    router.get('/login', forwardAuthenticated, (req, res) => res.render('login'));

    // Register Page
    router.get('/register', forwardAuthenticated, (req, res) => res.render('register'));

    // Register
    router.post('/register', (req, res) => {
      const { name, email, password, password2 } = req.body;
      let errors = [];

      if (!name || !email || !password || !password2) {
        errors.push({ msg: 'Please enter all fields' });
      }

      if (password != password2) {
        errors.push({ msg: 'Passwords do not match' });
      }

      if (password.length < 6) {
        errors.push({ msg: 'Password must be at least 6 characters' });
      }

      if (errors.length > 0) {
        res.render('register', {
          errors,
          name,
          email,
          password,
          password2
        });
      } else {
        User.findOne({ email: email }).then(user => {
          if (user) {
            errors.push({ msg: 'Email already exists' });
            res.render('register', {
              errors,
              name,
              email,
              password,
              password2
            });
          } else {
            const newUser = new User({
              name,
              email,
              password
            });

            bcrypt.genSalt(10, (err, salt) => {
              bcrypt.hash(newUser.password, salt, (err, hash) => {
                if (err) throw err;
                newUser.password = hash;
                newUser
                  .save()
                  .then(user => {
                    req.flash(
                      'success_msg',
                      'You are now registered and can log in'
                    );
                    res.redirect('/users/login');
                  })
                  .catch(err => console.log(err));
              });
            });
          }
        });
      }
    });



    // Login
    router.post('/login', (req, res, next) => {
      passport.authenticate('local', {
        successRedirect: '/users/mail',
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
    });


    // forgot password
    router.get('/forgot', function (req, res) {
      res.render('forgot');
    });

    router.post('/forgot', function (req, res, next) {
      async.waterfall([
        function (done) {
          crypto.randomBytes(20, function (err, buf) {
            let token = buf.toString('hex');
            done(err, token);
          });
        },
        function (token, done) {
          User.findOne({ email: req.body.email }, function (err, user) {
            if (!user) {
              req.flash('error', 'No account with that email address exists.');
              return res.redirect('/users/forgot');
            }

            user.resetPasswordToken = token;
            user.resetPasswordExpires = Date.now() + 3600000; // 1 hour

            user.save(function (err) {
              done(err, token, user);
            });
          });
        },
        function (token, user, done) {
          let smtpTransport = nodemailer.createTransport({
            service: 'Gmail',
            auth: {
              user: 'm93@gmail.com',
              pass: 'password'
            }
          });
          let mailOptions = {
            to: user.email,
            from: 'm93@gmail.com',
            subject: 'Node.js 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 + '/users/reset/' + token + '\n\n' +
              'If you did not request this, please ignore this email and your password will remain unchanged.\n'
          };
          smtpTransport.sendMail(mailOptions, function (err) {
            console.log('mail sent');
            req.flash('success', 'An e-mail has been sent to ' + user.email + ' with further instructions.');
            done(err, 'done');
          });
        }
      ], function (err) {
        if (err) return next(err);
        res.redirect('/users/forgot');
      });
    });

    router.get('/reset/:token', function (req, res) {
      User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function (err, user) {
        if (!user) {
          req.flash('error', 'Password reset token is invalid or has expired.');
          return res.redirect('/users/forgot');
        }
        res.render('reset', { token: req.params.token });
      });
    });

    router.post('/reset/:token', function (req, res) {
      async.waterfall([
        function (done) {
          User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function (err, user) {
            if (!user) {
              req.flash('error', 'Password reset token is invalid or has expired.');
              return res.redirect('/users/forgot');
            }
            if (req.body.password === req.body.confirm) {
              user.setPassword(req.body.password, function (err) {
                user.resetPasswordToken = undefined;
                user.resetPasswordExpires = undefined;

                user.save(function (err) {
                  req.logIn(user, function (err) {
                    done(err, user);
                  });
                });
              })
            } else {
              req.flash("error", "Passwords do not match.");
              return res.redirect('back');
            }
          });
        },
        function (user, done) {
          let smtpTransport = nodemailer.createTransport({
            service: 'Gmail',
            auth: {
              user: 'm93@gmail.com',
              pass: 'password'
            }
          });
          let mailOptions = {
            to: user.email,
            from: 'm93@gmail.com',
            subject: 'Your password has been changed',
            text: 'Hello,\n\n' +
              'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
          };
          smtpTransport.sendMail(mailOptions, function (err) {
            req.flash('success', 'Success! Your password has been changed.');
            done(err);
          });
        }
      ], function (err) {
        res.redirect('/users/mail');
      });
    });




    module.exports = router;

моя схема, когда я запрашиваю смену пароля, я получаю письмо с подтверждением того, что ваш пароль был изменен, но когда я пытаюсь войти в систему, пароль не работает.


    const mongoose = require('mongoose');
    const passportLocalMongoose = require("passport-local-mongoose");


    const UserSchema = new mongoose.Schema({
      name: {
        type: String,
        required: true
      },
      email: {
        type: String,
        required: true
      },
      resetPasswordToken: String,
      resetPasswordExpires: Date,
      password: {
        type: String,
        required: true
      },
      date: {
        type: Date,
        default: Date.now
      }
    });

    UserSchema.plugin(passportLocalMongoose);

    const User = mongoose.model('User', UserSchema);

    module.exports = User;

...