JWT 给 JsonWebTokenError “无效令牌”

Shi*_*mar 10 node.js express jwt

jsonwebtoken在 Node Application 中用于令牌验证。这里jwt.sign工作完美。但是当出现jwt.verify以下错误时

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

这是我的帖子和获取路由器

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);
      });

});
Run Code Online (Sandbox Code Playgroud)

下面是 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();
  });
}
Run Code Online (Sandbox Code Playgroud)

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

VIC*_*ING 17

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

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

希望这可以帮助某人。


Kur*_*den 6

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

// What caused the error
localStorage.setItem('jwt', JSON.stringify(token));
Run Code Online (Sandbox Code Playgroud)

解决方案,要么省略JSON.stringify,要么在验证时解析令牌:

localStorage.setItem('jwt', token);
// or
const token = JSON.parse(localStorage.getItem('jwt'));
Run Code Online (Sandbox Code Playgroud)


Shi*_*mar 5

我的代码是真的。我犯的错误是我在 Postman 中使用双引号(“token”)提供访问令牌。这就是邮递员给我以下错误的原因

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


Rev*_*mar 5

我遇到过同样的问题。基本上令牌不应该有更重要的信息。当我把它去掉时,它开始按预期工作。

例如:

我用的时候失败了 brearer *************....

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