有点奇怪的问题。我正在使用json web令牌构建NodeJS / Express api,以便为用户进行电子邮件验证。用户注册和电子邮件确认路由的代码如下。使用以下过程在Postman中测试这些路由时,一切正常(状态200,用户对象返回): 1.发送POST请求以创建用户。 2.使用mongodb shell从新用户获取令牌。 3.在获取请求中使用复制/粘贴令牌到确认路由。
然而,当实际点击通过电子邮件发送的链接时,数据库中的所有更新都是如此,但我收到401错误。即使从电子邮件中的链接复制和粘贴令牌并通过邮递员发送也具有相同的结果。
路线:
app.post('/api/users', (req, res) => {
let body = _.pick(req.body, [
'email', 'password', 'firstName', 'lastName', 'adminRequested'
]);
let user = new User(body);
user.save().then(() => {
return user.generateAuthToken('confirmation', '1h');
}).then((token) => {
let currentUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
let confirmationUrl = currentUrl + `/confirm/${token}`;
mailTransport.sendMail({
from: `Break Board API <${process.env.MAIL_USER}>`,
to: user.email,
subject: 'Your Email Confirmation Link',
text: `Click this link to verify your email: ${confirmationUrl}`
});
res.send(JSON.stringify(user, undefined, 2));
}).catch((e) => {
res.status(400).send(e);
});
});
app.get('/api/users/confirm/:token', confirmToken, (req, res) => {
let token = req.token;
let user = req.user;
req.user.update({
$set: {
emailConfirmed: true
},
$pull: {
tokens: {token}
}
}).then(() => {
res.send(user);
});
});
confirmToken中间件:
let {User} = require('./../models/user');
let confirmToken = (req, res, next) => {
let token = req.params.token;
User.findByToken(token).then((user) => {
if(!user) {
return Promise.reject();
}
req.user = user;
req.token = token;
next();
}).catch((e) => {
res.status(401).send();
});
};
中间件是整个代码中唯一一个有res.status(401)的地方,所以我知道它来自哪里,但不能理解为什么它只发生在使用电子邮件中的令牌,或者如果它确实是401,则所有数据库操作仍然成功。当在Postman中使用已修改或不存在的JWT令牌强制401错误时,数据库操作永远不会执行。
有什么想法吗?
答案 0 :(得分:0)
好的,在厌倦了之后我决定继续实施并无意中找到了解决方案。当我切换到以html而不是文本呈现电子邮件时,电子邮件客户端不再导致跟踪令牌链接。