Как проверить токен в NodeMailer, используя Express, Passport. js, Mon goose и MongoDB? - PullRequest
0 голосов
/ 24 февраля 2020

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

localhost:8016/users/confirmation/  /* GET request */

{
"type": "not-verified",
"msg": "We were unable to find a valid token. Your token may have expired."
}

И это маршрут:

router.route('/confirmation').get((req, res, next) => {
  Token.findOne({ token: req.body.token }, function(err, token) {
    if (!token)
      return res.status(400).send({
        type: 'not-verified',
        msg: 'We were unable to find a valid token. Your token may have expired.'
      });

    // If we found a token, find a matching user
    User.findOne({ _id: token._userId, email: req.body.username }, function(err, user) {
      if (!user)
        return res
          .status(400)
          .send({ msg: 'We were unable to find a user for this token.' });
      if (user.isVerified)
        return res.status(400).send({
          type: 'already-verified',
          msg: 'This user has already been verified.'
        });

      // Verify and save the user
      user.isVerified = true;
      user.save(function(err) {
        if (err) {
          return res.status(500).send({ msg: err.message });
        }
        res.status(200).send('The account has been verified. Please log in.');
      });
    });
  });
});

И это регистрация / регистрация route:

router
  .route('/registration')
  .post(
    body('username').custom(value => {
      return User.findOne({ username: value }).then(user => {
        // Return Promise
        if (user) {
          return Promise.reject('E-mail already in use');
        }
      });
    }),
    (req, res, next) => {
      // Checks for errors in validation
      console.log('req ', req.body);
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(409).json({ errors: errors.array() });
      }
      try {
        User.findOne({ username: req.body.username }, function(err, user) {
          // Make sure user doesn't already exist
          if (user)
            return res.status(400).send({
              msg:
                'The email address you have entered is already associated with another account.'
            });

          // Create and save the user
          user = new User({
            username: req.body.username,
            password: req.body.password
          });
          user.save(function(err) {
            if (err) {
              return res.status(500).send({ msg: err.message });
            }

            // Create a verification token for this user
            var token = new Token({
              _userId: user._id,
              token: crypto.randomBytes(16).toString('hex')
            });

            // Save the verification token
            token.save(function(err) {
              if (err) {
                return res.status(500).send({ msg: err.message });
              }

              // Send the email
              var transporter = nodemailer.createTransport({
                service: 'gmail',
                auth: {
                  user: `${process.env.EMAIL_ADDRESS}`,
                  pass: `${process.env.EMAIL_PASSWORD}`
                }
              });
              var mailOptions = {
                from: 'foo@fo.com',
                to: `${req.body.username}`,
                subject: 'Account Verification Token',
                text: `Hello,
                     Please verify your account by clicking the link:
                    http://${req.headers.host}/users/confirmation/${token.token}`
              };
              transporter.sendMail(mailOptions, function(err) {
                if (err) {
                  return res.status(500).send({ msg: err.message });
                }
                res
                  .status(200)
                  .send(`A verification email has been sent to ${user.username}.`);
              });
            });
          });
        });
      } catch (err) {
        return next(err);
      }
    }
  );

И пока я получаю пользователя в моей базе данных:

_id: ObjectId("1234")
roles: Array
isVerified: false
username: "foo@foo.com
password: "xxxxxxxx"
createdAt: 2020-02-24T14:49:01.717+00:00
updatedAt: 2020-02-24T14:49:01.717+00:00
__v: 0

И я получаю, что users связанный токен:

_id : ObjectId("5412")
_userId: ObjectId("1234")
token : 3ca2f9b4511d69b24e1a5ca0a69dc6de
createdAt : 2020-02-24T15:01:40.228+00:00
__v:0

Не следует ли щелкнуть ссылку, чтобы изменить свойство isVerified на true для этого пользователя?

Спасибо за понимание!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...