【问题标题】:JWT - Retrieving TokenJWT - 检索令牌
【发布时间】:2019-05-23 08:27:07
【问题描述】:

我试图弄清楚如何使用 JWT 为现有用户获取令牌 ID 或新令牌。目标是获取电子邮件和密码,在 mongo DB 中找到它,然后将令牌发送回客户端,然后为会话存储令牌。

目前在注册时我会加密密码并将电子邮件、姓名和密码存储在 mongoDB 中。

根据我一直在学习的内容,实际的令牌没有存储在 mongoDB 中,而是从 _id 生成的,由于某种原因我无法提取它,只是辞职并取回令牌,但没有运气。对于个人项目,我们非常感谢任何建议。

    User.create({
  name : req.body.name,
  email : req.body.email,
  password : req.body.password,
},
function (err, user) {
  if (err) return res.status(500).send("There was a problem registering the user.")
  // create a token
  var token = jwt.sign({ id: user._id }, config.secret);
  res.status(200).send({ auth: true, token: token });
});    

【问题讨论】:

  • 使用可以在查询密码的同时从mongodb查询_id的值
  • @AnshuKumar 我用下面的代码试过了,我得到了未定义的; User.findByEmail(userEmail, function (err, user) { if (err) return res.status(500).send("找用户有问题"); if (!user) return res.status(404 ).send("No user found."); console.log('id is '+user._id) res.status(200).send({ auth: true, user: user.id}); }) ;
  • 嗨@Jose,我在答案中给出了代码sn-p。如果您仍有任何问题,请在此处发表评论。

标签: mongodb jwt


【解决方案1】:

您可以尝试使用user._id.toString()user.id 代替user._id 来检索用户ID。

您可以从下面的代码中了解如何使用 JWT 令牌进行验证。

 login: (req, res) => {
    const { name, password } = req.body;

    mongoose.connect(connUri, { useNewUrlParser: true }, (err) => {
      let result = {};
      let status = 200;
      if(!err) {
        User.findOne({name}, (err, user) => {
          if (!err && user) {
            // We could compare passwords in our model instead of below as well
            bcrypt.compare(password, user.password).then(match => {
              if (match) {
                status = 200;
                // Create a token
                const payload = { user: user.name };
                const options = { expiresIn: '2d', issuer: 'anshukumar.me' };
                const secret = process.env.JWT_SECRET;
                const token = jwt.sign(payload, secret, options);

                // console.log('TOKEN', token);
                result.token = token;
                result.status = status;
                result.result = user;
              } else {
                status = 401;
                result.status = status;
                result.error = `Authentication error`;
              }
              res.status(status).send(result);
            }).catch(err => {
              status = 500;
              result.status = status;
              result.error = err;
              res.status(status).send(result);
            });
          } else {
            status = 404;
            result.status = status;
            result.error = err;
            res.status(status).send(result);
          }
        });
      } else {
        status = 500;
        result.status = status;
        result.error = err;
        res.status(status).send(result);
      }
    });
  }

您也可以查看这个在 Node JS 中实现 JWT Token 的 GitHub 存储库。 https://github.com/kumaranshu72/JWT-nodeJS

您也可以按照以下教程了解如何实现 JWT 身份验证:https://scotch.io/tutorials/authenticate-a-node-es6-api-with-json-web-tokens

【讨论】:

    【解决方案2】:

    我认为你可以在没有 _ 的情况下访问 id

        User.create({
      name : req.body.name,
      email : req.body.email,
      password : req.body.password,
    },
    function (err, user) {
      if (err) return res.status(500).send("There was a problem registering the user.")
      // create a token
      var token = jwt.sign({ id: user.id }, config.secret);
      res.status(200).send({ auth: true, token: token });
    });  
    

    user.id 而不是 user._id

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2020-04-02
      • 2019-07-09
      • 2018-02-04
      • 2021-02-13
      • 1970-01-01
      • 2016-01-31
      • 2018-03-17
      • 2018-06-19
      相关资源
      最近更新 更多