NodeJS JWT给出JsonWebTokenError“无效标记”

9o685dep  于 2023-01-30  发布在  Node.js
关注(0)|答案(6)|浏览(432)

我已经在我的节点应用程序中使用jsonwebtoken进行令牌验证。这里jwt.sign工作正常。但是当jwt.verify出现以下错误时
“授权”:假,“消息”:{“名称”:“JsonWebToken错误”,“消息”:“无效标记”} }
这是我的Post和Get路由器

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

我不知道我的程序出了什么问题。如有任何建议,我将不胜感激。谢谢

nx7onnlm

nx7onnlm1#

如果您正在向jwt.verify函数传递一个令牌,例如Bearer *************....,请确保在将其传递给jwt之前先拆分该令牌,方法是执行
const token = req.headers.authorization.split(' ')[1]; jwt.verify(token)
希望这能帮到什么人。

bxgwgixi

bxgwgixi2#

我的代码是真的。我犯的错误是在Postman中使用**双引号("token")**提供访问令牌。这就是为什么Postman给我以下错误
"授权":假,"消息":{"名称":" JsonWebToken错误","消息":"无效标记"}}

piwo6bdm

piwo6bdm3#

我也遇到了同样的问题。基本上令牌不应该有更多的信息。当我把它剥离出来时,它开始按预期工作。
例如:
使用brearer *************....时失败
使用*************....时有效

8e2ybdfx

8e2ybdfx4#

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

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

解决方案,请忽略JSON.stringify,或在验证时解析令牌:

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

f3temu5u5#

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

mwg9r5ms6#

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

相关问题