我刚刚在我的后端实现了json web令牌身份验证,我将jsonwebtoken
创建的令牌发送给客户端,如下所示:
var token = jwt.sign(user, secret.secretToken, { expiresInMinutes: 1 });
return res.json({ token: token });
在客户端,我只是将此令牌存储到SessionStorage。问题是令牌在一分钟后没有过期,我错过了什么吗?
编辑:我实施了this帖子中显示的相同内容。
答案 0 :(得分:20)
当我没有提供一个对象作为jwt.sign
的第一个参数时,我发现自己遇到了同样的问题。 jwt.sign('testuser', secret.secretToken, { expiresIn: '1h' });
。
jwt.sign
的错误用法确实有用,即使它是错误的,它只是忽略了提供的设置。 https://github.com/auth0/node-jsonwebtoken/issues/64
请务必提供一个对象作为第一个参数,例如jwt.sign({user: 'testuser'}, secret.secretToken, { expiresIn: '1h' });
<强>更新强> 已经报道了使用非标准javascript对象的问题,例如来自mongoose。版本5.5.2有一个修复此问题。更多细节here。谢谢@gugol的通知。确保传递具有所需属性的普通对象,而不是直接数据库对象或类似对象。
答案 1 :(得分:4)
将不会从会话存储中自动删除令牌。但是,如果您尝试验证令牌是否有效,则过期的令牌应该无效。
从this tutorial开始,有效性检查会抛出异常:
if (token) {
try {
var decoded = jwt.decode(token, app.get('jwtTokenSecret'));
// handle token here
} catch (err) {
return next();
}
} else {
next();
}
验证也包含在jsonwebtoken包中。这是来自文档:
(与回调同步)返回解码后的有效负载 签名(以及可选的过期,受众,发布者)有效。如果 不会,它会返回错误。
答案 2 :(得分:0)
fetch