Я использую 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
для этого пользователя?
Спасибо за понимание!