React Native + JWT还需要刷新令牌吗?

时间:2017-06-13 06:16:50

标签: security authentication react-native jwt

登录时,会从服务器发送JWT访问令牌并保存在RN中的AsyncStorage中。

现在我希望用户保持记录5年,直到他们:

  • 退出

  • 管理员撤销其令牌

  • 他们已登录3台设备,在其中一台设备上更改密码,这些设备应将其从其他2台设备中注销,直到再次在这些设备上登录为止

  • 丢失手机,并从其他设备登录以退出所有设备

看起来我必须在数据库中存储JWT令牌(我知道这不是JWT令牌的重点,并且根据我的阅读打败了他们服务的目的)但我需要知道用户在不同设备上的令牌,以便能够撤销它们。

让我感到困惑的一件事就是读取访问令牌应该是短暂的,比如说60分钟,并刷新令牌长期存在,比如5年我的情况。

我不明白为什么我们只能使用访问令牌,使用期限为5年(对于每个设备),将它们保存在数据库中的用户,以便我们识别他们的基于上述要点,令牌和撤销令牌?刷新令牌的重点是什么?在这种情况下甚至需要它吗?

注意:我还读到我们无法撤销访问令牌,但只能撤销刷新令牌,所以我真的很困惑。我是否必须向RN发送访问令牌和刷新令牌,并且只使用授权承载头的刷新令牌并仅在DB中保存刷新令牌?那么,如果访问令牌不是数据库中的那个,那么它的意义何在?

我认为这应该是一个简单的实现,但我的标准是5年登录,并能够根据上述几点撤销令牌。

这种情况的正确解决方案是什么?

1 个答案:

答案 0 :(得分:6)

访问令牌是短暂的,默认为24小时。但为什么?为什么不是5年?

  • 任何拥有访问令牌的人都可以保证访问用户(最初发布的用户)可以访问的任何内容。这意味着服务器无法区分 用户与拥有访问令牌的其他任何人

  • 没有退出。我在这里的意思是你可以让你的前端重定向到登录页面让他输入凭据,但真正注销不会在服务器中发生。从技术上讲,用户可以使用相同的访问令牌继续访问(直到它过期)

  • 无法撤消访问令牌。访问令牌仅在到期时失效。任何人都可以使用它,直到令牌过期。例如,如果到期时间设置为5年并且我偶然获得了您的令牌,那么我可以获得您拥有的所有访问权限,直到它到期为止,在这种情况下为5年。这正是使得到期时间小于24小时更有意义的。

现在让我们解决您的疑问。 "我希望用户登录,直到他"

  1. 退出
  2. 登录后向用户发送刷新令牌。非常安全地存储访问令牌和刷新令牌。在其访问令牌过期后,使用刷新令牌获取新的访问令牌。循环这直到他退出。当他注销时,删除前端的访问令牌和刷新令牌,并撤消服务器端的刷新令牌。 (再次,如果他以某种方式获得访问令牌,他仍然可以访问他的帐户,直到它到期)

    1. 管理员撤销令牌
    2. 服务器不能像我之前所说的那样撤销访问令牌,一旦发布有效期到期满,无论如何 - >>但只要用户拥有访问令牌:P如果他在过去1小时左右没有持续打开应用程序,则在打开应用程序后立即删除访问令牌。现在,前端被迫使用它存储的刷新令牌获取新的访问令牌。现在,您希望用户强制注销?撤销他的刷新令牌。

      1. 密码更改后退出所有设备
      2. 与2.更改密码后,撤销所有刷新令牌(如果您不希望用户再次登录,则撤销除当前设备之外的所有刷新令牌)。所有设备上的应用程序都将被强制使用刷新令牌获取新的访问令牌,但是由于您撤销了该令牌,用户除了使用他的凭据登录之外别无他法。

        1. 所有设备的用户触发退出
        2. 同样3.更改密码会触发所有设备上的注销,在这里您只需要在所有设备上添加"注销"将发送服务器请求的按钮,该服务器请求将撤消除当前设备之外的所有刷新令牌。

          警告:无法关闭当前用户会话;您需要等待用户退出应用程序,以便删除当前访问令牌。解决方法是在关闭应用程序时立即删除访问令牌(甚至他最小化应用程序)或将访问令牌过期设置为30分钟,前提是您可以容忍每次使用刷新令牌获取新访问令牌所导致的延迟那样做。您需要权衡时间以确保安全性,反之亦然,具体取决于您的应用规范。

          "这一切都很好,但我首先不想要刷新令牌" (替代解决方案):

          我不鼓励存储令牌,因为它会通过增加由于查询数据库而增加的响应时间来破坏扩展和阻止简单DDoS的目的。但是,由于Redis是在内存上运行的速度非常快的键值存储,因此有些人更喜欢在其中存储访问令牌。那怎么办?

          设置:用户登录后,发出访问令牌。将其存储在Redis中,然后将其发送给用户。

          1. 检查JWT签名&&令牌的完整性,如果它失败了,没有数据库查询。发回404用户未找到。这将与没有Redis功能的JWT一样快。

          2. 如果成功,请检查Redis是否有令牌。如果存在,则授予访问权限。如果没有,请让用户再次登录。请注意,这比使用JWT授予访问权限要慢一些,但是,嘿,你不能在其中存储Postgres或Mongo,这可能需要几毫秒的时间来响应; Redis是一个键值存储 - 并且它位于内存(而不是存储)上 - 比这些快得多。

          3. 当且仅当满足两个条件时才授予访问权限:JWT有效。 JWT出现在Redis

            回答您的疑问:

            现在可以退出。当用户点击注销时,从Redis中删除访问令牌。即使他有访问令牌,他也无法登录。访问令牌现在无效。

            1. 管理员强制注销:从Redis删除该用户的访问令牌。
            2. 用户成功授予服务器访问权限后,您应允许用户发出请求以删除具有相同用户ID(或uid)的所有其他令牌,这将允许注销< / p>

              1. 更改密码后,发出此类请求。

              2. 在从其他设备退出时,发出此类请求。

              3. 最后左边1.保持登录状态直到用户退出:既然您有权使访问令牌无效,而您在不使用Redis时也没有,那么您可以使用5年有效访问令牌,如果您实施其他必需的安全措施,以防止滥用访问令牌。

相关问题