Json Web 令牌不会过期
Posted
技术标签:
【中文标题】Json Web 令牌不会过期【英文标题】:Json web token does not expire 【发布时间】:2014-06-30 20:46:45 【问题描述】:我刚刚实现了一个 json Web 令牌身份验证,在我的后端我将 jsonwebtoken
创建的令牌发送给客户端,如下所示:
var token = jwt.sign(user, secret.secretToken, expiresInMinutes: 1 );
return res.json( token: token );
在客户端,我只是将此令牌存储到 SessionStorage。问题是令牌在一分钟后不会过期,我错过了什么吗?
编辑:我实现了与this 帖子中显示的相同的东西。
【问题讨论】:
【参考方案1】:我发现自己在不提供对象作为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 的通知。确保传递具有所需属性的普通对象,而不是直接数据库对象或类似对象。
【讨论】:
哇。这让我发疯了。谢谢马吕斯。 我正在向它传递一个对象,但令牌仍然没有过期。我正在使用expiresIn:60
,因为“expiresInMinutes”现在已被弃用。
@gugol 您应该在 github 上打开一个新问题或在此处创建一个新问题,并附上您的完整用法示例。
@MariusRumpf 我做了,但我还没有得到答案:github.com/auth0/node-jsonwebtoken/issues/147【参考方案2】:
令牌不会自动从会话存储中删除。但是,如果您尝试验证令牌是否有效,则过期的令牌应该是无效的。
来自this tutorial,有效性检查应该抛出异常:
if (token)
try
var decoded = jwt.decode(token, app.get('jwtTokenSecret'));
// handle token here
catch (err)
return next();
else
next();
验证也包含在jsonwebtoken 包中。这是来自文档:
(与回调同步)返回解码的有效负载,如果 签名(以及可选的到期、受众、发行者)是有效的。如果 不,它会返回错误。
【讨论】:
嗨,戴文,感谢您的回答。问题出在他们的源代码中,正如您所见,时间乘以 1000 之前,他们在 10 天前修复了它github.com/auth0/node-jsonwebtoken/commit/… 应该使用jwt.verify方法而不是jwt.decode方法。【参考方案3】://use this to create the token
var token = jwt.sign(
exp: "1h",
data: "payload"
, "secret");
/*while checking the token ,Throws error if the token is expired else you will get the decoded data*/
jwt.verify(token, 'secret', function(err, decoded)
if (err)
/*
err =
name: 'TokenExpiredError',
message: 'jwt expired',
expiredAt: 1408621000
*/
);
【讨论】:
以上是关于Json Web 令牌不会过期的主要内容,如果未能解决你的问题,请参考以下文章
如果 JSON Web 令牌(JWT)过期,从 Web 服务抛出错误的标准方法?