node.js - JWT(JSON Web Token)自动延长到期时间
我想为我们的新REST API实现基于JWT的身份验证。 但是由于在令牌中设置了到期,是否可以自动延长它? 我不希望用户在每X分钟后需要登录,如果他们在那段时间内积极使用该应用程序。 这将是一个巨大的用户体验失败。
但是延长过期会创建一个新令牌(旧令牌在到期之前仍然有效)。 每次请求后生成一个新令牌对我来说都是愚蠢的。 当多个令牌同时有效时,听起来像是一个安全问题。 当然,我可以使用黑名单使旧的旧列表无效,但我需要存储令牌。 JWT的一个好处就是没有存储空间。
我发现Auth0是如何解决它的。 它们不仅使用JWT令牌,还使用刷新令牌:[https://docs.auth0.com/refresh-token]
但同样,为了实现这一点(没有Auth0),我需要存储刷新令牌并保持其过期。 那么真正的好处是什么? 为什么不只有一个令牌(不是JWT)并在服务器上保持过期?
还有其他选择吗? 使用JWT不适合这种情况吗?
9个解决方案
446 votes
我在Auth0工作,我参与了刷新令牌功能的设计。
这一切都取决于应用程序的类型,这是我们推荐的方法。
Web应用程序
一个好的模式是在令牌到期之前刷新令牌。
将令牌过期设置为一周,并在每次用户打开Web应用程序时每隔一小时刷新令牌。 如果用户未打开应用程序超过一周,则必须再次登录,这是可接受的Web应用程序UX。
要刷新令牌,您的API需要一个新端点,该端点接收有效的,未过期的JWT,并使用新的过期字段返回相同的签名JWT。 然后,Web应用程序将令牌存储在某处。
移动/本机应用程序
大多数本机应用程序只登录一次。
我们的想法是刷新令牌永不过期,并且可以始终为有效的JWT进行交换。
令牌永不过期的问题绝不是永远不会。 如果丢失手机怎么办? 因此,它需要以某种方式由用户识别,并且应用程序需要提供撤销访问的方法。 我们决定使用设备的名称,例如 “maryo的iPad”。 然后,用户可以转到该应用程序并撤消对“maryo的iPad”的访问权限。
另一种方法是撤消特定事件上的刷新令牌。 一个有趣的事件是更改密码。
我们认为JWT对这些用例没用,所以我们使用随机生成的字符串,然后将它存储在我们这边。
José F. Romaniello answered 2019-01-08T03:24:37Z
57 votes
在您自己处理auth的情况下(即不使用Auth0之类的提供