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 “无效令牌”的主要内容,如果未能解决你的问题,请参考以下文章
JSONWebTokenError:JWT 在 index.js 处格式错误
JsonWebTokenError: jwt malformed: can't verify my Webtoken
为什么令牌上有JWT(JSON Web令牌)前缀?回复:JsonWebTokenError:无效令牌