JWT给JsonWebTokenError“无效令牌”

时间:2018-02-04 08:52:17

标签: node.js express jwt

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

  

“auth”:false,       “信息”: {           “name”:“JsonWebTokenError”,           “message”:“无效令牌”       }   }

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

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

我无法弄清楚我的计划中有什么问题。任何建议都会受到赞赏。 感谢

6 个答案:

答案 0 :(得分:11)

如果您像itineraries: [ { days: 1, itinerary: [ { day: "Day 1", description: "description", overnight: "overnight info", altitude: 150.5 }, { day: "Day 2", description: "description 2", overnight: "overnight info", altitude: 150.5 } ] } ] 这样将令牌传递给jwt.verify函数,请确保先将令牌拆分,然后再将令牌传递给jwt

Bearer *************....

希望这对某人有帮助。

答案 1 :(得分:1)

我的守则是真的。我正在做的错误是我在Postman中使用双引号("令牌")提供访问令牌。这就是邮递员给我错误的原因

  

" auth":false," message":{" name":" JsonWebTokenError"," message" :"无效令牌" }}

答案 2 :(得分:0)

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

例如:

我使用brearer *************....

失败

使用*************....

时有效

答案 3 :(得分:0)

 const token = req.header('token');
 try {
    const decoded = jwt.verify(JSON.parse(token), privateKey);
    console.log(decoded)
 } catch(err) {
    console.log('err', err)
 }

答案 4 :(得分:0)

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

// 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'));

答案 5 :(得分:-2)

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

相关问题