JWT 给 JsonWebTokenError “无效令牌”

Posted

技术标签:

【中文标题】JWT 给 JsonWebTokenError “无效令牌”【英文标题】:JWT gives JsonWebTokenError "invalid token" 【发布时间】: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();
  );

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

【问题讨论】:

【参考方案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),然后传递到验证

【讨论】:

以上是关于JWT 给 JsonWebTokenError “无效令牌”的主要内容,如果未能解决你的问题,请参考以下文章

jwt 服务器端认证 JsonWebTokenError

JSONWebTokenError:JWT 在 index.js 处格式错误

JsonWebTokenError: jwt malformed: can't verify my Webtoken

为什么令牌上有JWT(JSON Web令牌)前缀?回复:JsonWebTokenError:无效令牌

错误:error:0909006C:PEMroutines:get_name:no start line

JsonWebToken 遇到问题; JsonWebToken 错误:必须提供 JWT