【问题标题】:JWT gives JsonWebTokenError "invalid token"JWT 给 JsonWebTokenError “无效令牌”
【发布时间】:2018-07-14 08:25:47
【问题描述】:

我在我的节点应用程序中使用jsonwebtoken 进行令牌验证。 这里jwt.sign 完美运行。但是当jwt.verify 给出以下错误时

“身份验证”:假, “信息”: { "name": "JsonWebTokenError", “消息”:“无效令牌” } }

这是我的发布和获取路由器

router.post('/signup',(req,res)=>{
    const body = _.pick(req.body,['username','email_id','name','college','password','dob','gender','city','joinedOn','bio']);
    User.findOne({'username':body.username},function(err,user){
        if(err){
            res.status(404).send(err)
        }else if(user){
            res.status(404).send('User with Username Exists')
        }else{
            var user = new User(body);
            user.save().then((user) => {
                var token = jwt.sign({ username: user.username},'secret', {
                    "algorithm": "HS256",
                    expiresIn: 86400 // expires in 24 hours
                  });
                  res.status(200).send({ auth: true, token: token });
              }, (e) => {
                res.status(400).send(e)
              })
        }
    })

});

router.get('/me', VerifyToken, function(req, res) {

    User.findOne({username:req.username}, function (err, user) {
        if (err) return res.status(500).send(err);
        if (!user) return res.status(404).send("No user found.");
        res.status(200).send(user);
      });

});

下面是verifyToken函数

function verifyToken(req, res, next) {
  var token =  req.headers['x-access-token'];
  if (!token)
    return res.status(403).send({ auth: false, message: 'No token provided.' });
    console.log(token)
  jwt.verify(token,'secret', function(err, decoded) {
    if (err)
    return res.status(500).send({ auth: false, message: err }); 
    //req.username = decoded.username;
    console.log(decoded)
    next();
  });
}

我无法弄清楚我的程序出了什么问题。任何建议都将不胜感激。 谢谢

【问题讨论】:

    标签: node.js express jwt


    【解决方案1】:

    如果您像 Bearer *************.... 那样将令牌传递给 jwt.verify 函数,请确保先拆分令牌,然后再将其传递给 jwt

    const token = req.headers.authorization.split(' ')[1]; jwt.verify(token)

    希望这对某人有所帮助。

    【讨论】:

    • 谢谢!就是这样。
    【解决方案2】:

    我的代码是真的。我犯的错误是在 Postman 中使用 double quote("token") 提供访问令牌。这就是为什么邮递员给我以下错误

    "auth": false, "message": { "name": "JsonWebTokenError", "message": "invalid token" } }

    【讨论】:

    • 感谢您犯了这个错误并为我节省了一些时间(:
    【解决方案3】:

    我有同样的问题。基本上令牌不应该有更丰富的信息。当我将其剥离时,它开始按预期工作。

    例如:

    使用brearer *************....时失败

    当我使用*************....时工作

    【讨论】:

      【解决方案4】:
       const token = req.header('token');
       try {
          const decoded = jwt.verify(JSON.parse(token), privateKey);
          console.log(decoded)
       } catch(err) {
          console.log('err', err)
       }
      

      【讨论】:

      • 你应该解释你的答案,而不是转储代码。
      【解决方案5】:

      我遇到了类似的错误,因为我在 localStorage 中使用 JSON.stringify 持久化了令牌,这会在令牌中添加两个双引号,因此在验证令牌时会导致令牌无效。

      // What caused the error
      localStorage.setItem('jwt', JSON.stringify(token));
      

      解决办法,要么省略JSON.stringify,要么在验证时解析token:

      localStorage.setItem('jwt', token);
      // or
      const token = JSON.parse(localStorage.getItem('jwt'));
      

      【讨论】:

        【解决方案6】:

        当您从服务传递令牌时,从本地存储转换为 JSON.parse(token),然后传递到验证

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-22
          • 2021-04-13
          • 2021-09-25
          • 2017-03-08
          • 2019-03-19
          • 2020-04-19
          • 2016-10-20
          • 2018-04-11
          相关资源
          最近更新 更多