Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点/Express API,使用JWT令牌的电子邮件验证,意外行为_Node.js_Mongodb_Express_Json Web Token - Fatal编程技术网

Node.js 节点/Express API,使用JWT令牌的电子邮件验证,意外行为

Node.js 节点/Express API,使用JWT令牌的电子邮件验证,意外行为,node.js,mongodb,express,json-web-token,Node.js,Mongodb,Express,Json Web Token,有点奇怪。我正在使用json web令牌构建一个NodeJS/Express api,用于用户的电子邮件验证。下面是用户注册和电子邮件确认路由的代码。在Postman中使用以下过程测试这些路由时,一切正常(状态200,用户对象返回): 1.发送POST请求以创建用户。 2.使用mongodb shell从新用户处获取令牌。 3.在get请求到确认路由中使用复制/粘贴令牌 然而,当实际单击通过电子邮件发送的链接时,DB中的所有内容都会按原意更新,但我得到一个401错误。即使从电子邮件中的链接复制和

有点奇怪。我正在使用json web令牌构建一个NodeJS/Express api,用于用户的电子邮件验证。下面是用户注册和电子邮件确认路由的代码。在Postman中使用以下过程测试这些路由时,一切正常(状态200,用户对象返回): 1.发送POST请求以创建用户。 2.使用mongodb shell从新用户处获取令牌。 3.在get请求到确认路由中使用复制/粘贴令牌

然而,当实际单击通过电子邮件发送的链接时,DB中的所有内容都会按原意更新,但我得到一个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);
  });
});
中间件是整个代码中唯一一个有res.status(401)的地方,所以我知道它是从哪里来的,但我不明白为什么它只在使用电子邮件中的令牌时发生,或者如果它确实是401,那么所有的DB操作仍然成功。当使用修改的或不存在的JWT令牌在Postman中强制401错误时,将永远不会执行DB操作


有什么想法吗?

好吧,受够了之后,我决定继续实施,无意中找到了解决方案。当我切换到以html而不是文本呈现电子邮件时,电子邮件客户端不再导致令牌链接被跟踪。

因此,通过大量的尝试和错误,我知道了发生了什么,但仍然不确定如何修复它。基本上,每当我打开电子邮件,在我点击链接之前,它就是在验证链接。因此,当我点击链接时,所有内容都已更新,令牌已被删除。
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();
  });
};