Authentication 带过期JWT刷新令牌的滑动窗口

Authentication 带过期JWT刷新令牌的滑动窗口,authentication,jwt,Authentication,Jwt,我正在运行一个网站+本机应用程序,通过HTTPS与我的后端进行通信。必须满足以下要求: 网站上的滑动会话。这意味着,如果用户在最后xx分钟内与网站进行了交互,则不得注销 在网站上记住我。勾选此选项后,用户不得注销(或在很长时间后) 用户不得在应用程序上注销 用户(当前登录)或特定事件(密码更改)均可撤销访问权限 我目前拥有的是:当数据库中的密码散列和用户名匹配时,刷新令牌端点生成JWT。每个刷新令牌都有一个存储在数据库中的jti,以及过期(仅适用于DB清理)、设备id和吊销标志。 刷新令牌可以命

我正在运行一个网站+本机应用程序,通过HTTPS与我的后端进行通信。必须满足以下要求:

  • 网站上的滑动会话。这意味着,如果用户在最后xx分钟内与网站进行了交互,则不得注销
  • 在网站上记住我。勾选此选项后,用户不得注销(或在很长时间后)
  • 用户不得在应用程序上注销
  • 用户(当前登录)或特定事件(密码更改)均可撤销访问权限
  • 我目前拥有的是:当数据库中的密码散列和用户名匹配时,刷新令牌端点生成JWT。每个刷新令牌都有一个存储在数据库中的jti,以及过期(仅适用于DB清理)、设备id和吊销标志。 刷新令牌可以命中另一个端点,该令牌返回JWT访问令牌。访问令牌的有效期为15分钟。无法吊销访问令牌

    我的问题出现在需求1中。我不希望用户在与网站交互时重新验证。这意味着我需要刷新令牌。但是,刷新令牌必须仅在最后一次用户交互+xx分钟内有效。我无法在每个请求中扩展访问令牌,因为无法将访问令牌列入黑名单。这意味着泄漏的访问令牌就像一个永远的主密钥(只要您在15分钟的时间间隔内不断点击api)。但我也不知道请求令牌的到期时间

    第二个问题是(2)匿名模式或多个设备。假设用户打开20个私人选项卡,并在所有选项卡上使用“记住我”。然后我必须在数据库中存储20个令牌。当然,我可以将类型“web”设置为5,将“app”设置为3,并从数据库中删除最后访问的最旧的一个(从而使其无效)。但如果他在某个地方打开5个私人标签,这会让他在“主”浏览器上注销。它还将手机数量限制在2部

    不同的PC/笔记本电脑也会生成许多web类型的刷新令牌。我如何才能最好地识别相应的设备,以便可以撤销访问,但在应用程序的生命周期内我也不会存储数百个刷新令牌?最好是每个设备一个刷新令牌(windows+firefox、iPhoneA、iPhoneB、windows2+firefox)。但是识别台式电脑非常困难

    归根结底是:

  • 我如何在数据库中存储刷新令牌,以便最终用户能够识别它们(例如Whatsapp网站“Safari始于纽约,最后一次使用于xxx”
  • 如何避免在DB中每个用户拥有数百个令牌(因为刷新令牌基本上不会过期,用户可以在不注销的情况下打开任意多个私人选项卡)
  • 如何使用刷新/访问令牌模式实现滑动窗口?因此,客户端没有无限的刷新令牌,而且只要有任何使用,访问令牌过期后也不会注销。我可以将其保存在会话存储中,但它仍然会扰乱我的数据库,并向用户显示为“当前登录”(显示所有刷新令牌)因为它基本上仍然有效
  • 网站上的滑动会话。这意味着如果用户在最后xx分钟内与网站进行了交互,则不得注销

    要解决此问题,您可以使用刷新令牌,即当用户首次登录时,应用程序将返回一个访问令牌(JWT格式),并将过期日期设置为您想要的金额。 当用户浏览应用程序时,您的后端将返回一个X-Refresh-Token标头,该标头在您xx的时间内有效(即,您需要为每个后端调用返回此标头)

    如果访问令牌已过期(后端将读取使用的访问令牌,并对过期日期令牌字段执行检查),后端将返回401未经授权的错误, 并且您的客户端必须调用身份验证端点,提供存储的最后一个刷新令牌,以发布新的访问令牌

    通过此实现,您的需求#1得到满足

    在网站上记住我。选中此选项后,用户不得注销(或在很长时间后)

    要解决这个问题,您只需要生成一个长寿命访问令牌(即,将过期日期设置为您想要的时间量)

    用户不得在应用程序上注销

    我不明白这个

    用户(当前登录)或特定事件(密码更改)均可撤销访问权限

    由于后端是无状态的,撤销访问令牌是一个非常复杂的话题。 希望有很多模式可以解决这个问题,我们只需要讨论一下