JWT中的时间到期问题

时间:2016-12-24 16:41:45

标签: authentication jwt json-web-token

如您所知,使用基于令牌的身份验证而非基于会话的原因有充分的理由。

在基于会话的过程中,当然有一个到期时间。因此,如果用户暂时不活动,他的会话将过期。但在到期之前,如果他向服务器发送请求,他的时间将会延长。

有关于JWT的精彩教程here。我对令牌的过期时间有疑问。想象一下,我们将到期时间设置为100秒,然后我们签署令牌。用户是否活跃无关紧要。 100秒后该令牌将不再有效。这困扰了用户。有没有办法延长时间?

这是一种真正的方法,还是我有一个错误。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,那么在创建期间改变JWT令牌的到期是相当简单的......

  

“exp”(到期时间)声明标识到期时间      或者之后不得接受JWT进行处理。该      处理“exp”索赔要求当前日期/时间      必须在“exp”声明中列出的失效日期/时间之前。

可在此处找到更多信息https://tools.ietf.org/html/rfc7519#section-4.1.4

基本上exp键需要一个unix时间戳 - 将时间戳设置为>从现在开始100秒,你将完成目标。

要“刷新”您的API需要接收有效JWT的服务的令牌,并返回具有更新过期的相同签名JWT。

答案 1 :(得分:1)

静音刷新 我们基于JWT的应用程序的用户仍将面临两个主要问题:

鉴于我们在JWT上的有效期很短,该用户将每15分钟注销一次。这将是一个非常糟糕的经历。理想情况下,我们可能希望用户长时间登录。 如果用户关闭其应用程序并再次打开它,则需要再次登录。他们的会话不会持久,因为我们没有将JWT令牌保存在任何地方的客户端上。 为了解决此问题,大多数JWT提供程序都提供了刷新令牌。刷新令牌具有2个属性:

它可以用于进行API调用(例如/ refresh_token),以在先前的JWT到期之前获取新的JWT令牌。 可以在客户端上的所有会话中安全地保留它!

在HASURA博客中有个精彩的展览-> https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/

答案 2 :(得分:0)

您没有提供更多信息,但是我假设您将使用JWT进行Web浏览器身份验证。 您可以将JWT保存在具有httpOnlysecure属性的Cookie中,并设置足够长(可能为1年)的cookie过期时间,并在您的JWT claims内部设置exp属性缩短时间(可能是1周或其他时间)。现在,在每个请求中,cookie都将发送到服务器,以便您检查过期时间。 像这样的东西:

if(decodedJwt.exp < Date.now()){
  //token is valid, do your stuff
}else {
  //token expired, regenerate it and set it to the cookie
  //also update the expire time of the cookie 
}