jwt的token自动续约_node.js - JWT(JSON Web Token)自动延长到期时间

本文探讨了如何在使用JWT进行身份验证的Node.js REST API中实现自动续期。讨论了多种策略,包括使用刷新令牌、定期刷新和用户活动检测,以及在不存储令牌的情况下确保安全性。提出了在不同类型的Web和移动应用中适用的最佳实践。
摘要由CSDN通过智能技术生成

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之类的提供

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给您一些关于js-cookie设置token过期时间以及ASP.NET Core Web API之JWT刷新Token的实用技巧。 首先,关于js-cookie设置token过期时间,可以通过以下代码实现: ```javascript // 设置cookie过期时间为1天 Cookies.set('token', 'your_token_value', { expires: 1 }); ``` 其中,`expires`属性表示过期时间,单位为天。 其次,关于ASP.NET Core Web API之JWT刷新Token,可以采用以下方法: 在JWT的payload中加入`exp`属性,表示token过期时间。当token过期后,客户端需要向服务器发送请求,获取新的token。服务器对于过期token,可以返回一个特定的状态码,比如401 Unauthorized。客户端接收到该状态码后,可以重新向服务器发送请求,获取新的token。 同时,在服务器端需要实现一个刷新token的接口,接口的功能是根据旧的token生成新的token。具体实现可以参考以下代码: ```csharp [HttpPost("refresh-token")] public IActionResult RefreshToken([FromBody] string token) { // 验证旧的token是否有效 var principal = _jwtService.GetPrincipalFromExpiredToken(token); if (principal == null) return BadRequest("Invalid token"); // 生成新的token var newToken = _jwtService.GenerateToken(principal.Claims); return Ok(newToken); } ``` 其中,`_jwtService`表示JWT的服务类,`GetPrincipalFromExpiredToken`方法用于从过期token中获取`ClaimsPrincipal`对象,`GenerateToken`方法用于生成新的token。 希望以上内容对您有所帮助。如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值