如您所知,使用基于令牌的身份验证而非基于会话的原因有充分的理由。
在基于会话的过程中,当然有一个到期时间。因此,如果用户暂时不活动,他的会话将过期。但在到期之前,如果他向服务器发送请求,他的时间将会延长。
有关于JWT
的精彩教程here。我对令牌的过期时间有疑问。想象一下,我们将到期时间设置为100秒,然后我们签署令牌。用户是否活跃无关紧要。 100秒后该令牌将不再有效。这困扰了用户。有没有办法延长时间?
这是一种真正的方法,还是我有一个错误。有什么想法吗?
答案 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保存在具有httpOnly
和secure
属性的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
}