Как я могу проверить сброс пароля и одновременно отправить электронное письмо и всплывающее уведомление? - PullRequest
0 голосов
/ 17 октября 2019

Я работаю в Node / ExpressJs. Я пытаюсь получить форму для сброса пароля:

1) Отправить электронное письмо с уникальной ссылкой, которая вернет пользователя на страницу сброса пароля (работает)

Но чтоЯ застрял на это:

2) На странице сброса мне нужно:

a) Проверьте, являются ли оба пароля одинаковыми.

b) Если они не совпадают, выведите всплывающее уведомление и попросите их еще раз ввести новый пароль.

c) Если пароли верны, отправьте их обратно на страницу входа и отправьте электронное письмо, подтверждающее успешное изменение, и попросите всплывающее уведомление (req.flash) сообщить, что оно было успешно изменено.

Пока чтоЧто работает, так это то, что он перейдет на страницу забытого пароля и отправит электронное письмо пользователю, а затем отправит его обратно по ссылке токена в emIL, и они могут ввести свой пароль на странице сброса пароля, и на MongoDb он покажет, что пароль изменен, НО это будетне отправить успешное письмо или всплывающее уведомление (req.flash).

У меня написан код, но, очевидно, я помещаю его не в то место, или я получаю ошибки, что я что-то не объявляю, и иногда он говорит «недопустимые аргументы» или не может деструктурировать код. Вещи в том же духе. Я написал все остальное до этого момента довольно хорошо, и все это работает, это просто вещь, которая ставит меня в тупик последние два дня.

Любая помощь была бы великолепна, мне просто нужно знать, где я иду не так, и любое полезное объяснение было бы фантастическим! Код, который я прокомментировал, - это то, что доставляет мне неприятности.

Вот код:

// Forgot Password
// Will send email on confirmation of valid User
router.get('/forgot', (req, res) => {
  res.render('forgot')
});

router.post('/forgot', (req,res) => {
  crypto.randomBytes(32, (err, buffer) => {
    if(err) {
      console.log(err);
      return res.redirect('/users/forgot');
    }
    const token = buffer.toString('hex');
    User.findOne({ email: req.body.email })
      .then(user => {
        if(!user) {
          req.flash('error_msg', 'No Account with that Email');
          return res.redirect('/users/forgot');
        }
        user.resetToken = token;
        user.resetTokenExpiration = Date.now() + 3600000;
        return user.save();
      })
      .then(result => {
        req.flash('success_msg', 'Please check Email');
        res.redirect('/users/login');
        transporter.sendMail({
          to: req.body.email,
          from: 'info@freightmule.com',
          subject: 'Password Reset Request',
          html: `
          <h1>You requested a Password Reset</h1>
          <p>Click this <a href="http://localhost:5000/users/forgot/${token}">link</a> to set a new password.</p>
          <p>If you did not request this change, please Contact us immediately!</p>
          `
        });
      })
      .catch(err => {
        console.log(err);
      });
    });
  });

// Reset Password Page
// User is redirected here from Reset Email
router.get('/forgot/:token', (req, res) => {
  const token = req.params.token;
  User.findOne({ resetToken: token, resetTokenExpiration: { $gt: Date.now() } })
  .then(user => {
    let message = req.flash('error');
    if(message.length > 0) {
      message = message[0];
    } else {
      message = null;
    }
    res.render('reset', {
      errorMessage: message,
      userId: user._id.toString(),
      passwordToken: token
    });
  })
  .catch(err => {
    console.log(err);
  });
});

// User enters new password
// Checks if passwords match then sends email & notification of success & goes back to login page
router.post('/reset', (req, res) => {
  const newPassword = req.body.password;
  const userId = req.body.userId;
  const passwordToken = req.body.passwordToken;
  let resetUser;
  let errors = [];

  // // Check required fields
  // if(!newPassword || !newPassword2) {
  //   errors.push({ msg: 'Please fill in all fields' });
  // }
  //
  // // Check Passwords match
  // if(newPassword !== newPassword2) {
  //   errors.push({ msg: 'Passwords do not match'})
  // }
  //
  // // Check Password length
  // if(password.length < 8) {
  //   errors.push({ msg: 'Password needs to be at least 8 characters' })
  // }

  User.findOne({
    resetToken: passwordToken,
    resetTokenExpiration: { $gt: Date.now() },
    _id: userId
  })
  .then(user => {
    resetUser = user;
    return bcrypt.hash(newPassword, 12);
  })
  .then(hashedPassword => {
    resetUser.password = hashedPassword;
    resetUser.resetToken = null;
    resetUser.resetTokenExpiration = undefined;
    return resetUser.save();
  })
  .then(result => {
    req.flash('Password Changed Successful, Please Login')
    res.redirect('/users/login');
  })
  .catch(err => {
    console.log(err);
  });
});


// transporter.sendMail({
//   to: req.body.email,
//   from: 'info@freightmule.com',
//   subject: 'Password Recently Reset',
//   html: `

//   <h1>You Reset Your Password Successfully!</h1>
//   <p>You recently Reset Your Password</p>
//   <p>Your Password is successfully changed!</p>
//   <p>If you did not request this change please contact us immediately!</p>
//   `
// });

Вот страница пароля для отдыха в .ejs

<% include ./partials/head %>

  <div class="img-wrapper flex-center">

    <div class="forms-title">
      <h1>Reset Password</h1>
    </div>

<% include ./partials/messages %>

    <div class="reset-form forms">
        <form action="/users/reset" method="POST">
          <div class="form-group">
            <label for="password">New Password</label>
            <input
              type="password"
              id="password"
              name="password"
              class="form-control"
              placeholder="New Password"
              value="<%= typeof password != 'undefined' ? password : '' %>"
            />
          </div>

          <input type="hidden" name="userId" value="<%= userId %>">
          <input type="hidden" name="passwordToken" value="<%= passwordToken %>">
          <button type="submit" class="btn btn-color btn-block">
            Reset Password
          </button>
        </form>
    </div>
    <p class="lead mt-4">Have An Account? <a class="login" href="/users/login">Login</a></p>

  </div>


<% include ./partials/footer %>
...