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 令牌过期和记住我功能

如果 JSON Web 令牌(JWT)过期,从 Web 服务抛出错误的标准方法?

JWT(JSON Web Token)自动延长过期时间

使用 JWT(JSON Web 令牌)设置令牌到期的 RESTful API

JWT 令牌在一定时间后不会过期

如何使我的身份验证令牌不会过期?