JWT 中的时间过期问题

Time expiration issue in JWT

如您所知,使用基于令牌的身份验证而不是基于会话的身份验证有一些很好的理由。

在session based中,当然有过期时间。因此,如果用户有一段时间没有活动,他的会话就会过期。但是在到期之前,如果他向服务器发送请求,他的时间会延长。

有一个很棒的教程 here 关于 JWT。我对 令牌 的过期时间有疑问。假设我们将过期时间设置为 100 秒,然后我们对令牌进行签名。用户是否活跃并不重要。 100 秒后该令牌将不再有效。这困扰着用户。有什么办法可以延长时间吗?

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

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

The "exp" (expiration time) claim identifies the expiration time on or after which the JWT MUST NOT be accepted for processing. The processing of the "exp" claim requires that the current date/time MUST be before the expiration date/time listed in the "exp" claim.

可以在此处找到更多信息https://www.rfc-editor.org/rfc/rfc7519#section-4.1.4

基本上 exp 密钥采用 unix 时间戳 - 将时间戳设置为从现在起 > 100 秒,您将实现您的目标。

要“刷新”令牌,您的 API 需要一个服务来接收有效的 JWT 和 returns 具有更新过期的相同签名 JWT。

您没有提供更多信息,但我假设您将使用 JWT 进行网络浏览器身份验证。 您可以将 JWT 保存在具有 httpOnlysecure 属性的 cookie 中,并设置足够长的 cookie 过期时间(可能 1 年),并在您的 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 
}

静默刷新 我们基于 JWT 的应用程序的用户仍然会面临 2 个主要问题:

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

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

这里是 HASURA BLOG 的精彩展览--> https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/