2017-06-13 32 views
3

登录时,JWT访问令牌将从服务器发送并保存在RN的AsyncStorage中。React Native + JWT仍然需要刷新令牌?

现在我想要保持登录了5年的用户,直到他们要么:

  • 注销

  • 管理员撤销其令牌

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

  • 失去他们的电话和登录从其它设备从所有设备

它看起来注销像我不得不JWT令牌存储在数据库中(我知道这不是JWT令牌和失败点他们服务的目的是基于我的阅读),但我需要知道用户的令牌,在他们不同的设备上,能够撤销它们。

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

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

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

我认为这应该是简单的实现,但我的标准是5年的登录和能够撤销令牌基于上述点。

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

回答

2

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

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

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

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

现在让我们解决您的查询。 “我想用户先登录,直到他”

  1. 中注销

发送刷新令牌用户他签署之后。同时存储访问令牌和刷新令牌非常安全。访问令牌过期后,使用刷新令牌获取新的访问令牌。循环播放直到他退出。当他注销时,请删除前端的访问令牌和刷新令牌,并撤销服务器端的刷新令牌。 (同样,如果他以某种方式获得访问令牌后,他仍然可以直到它过期访问他的帐户)

  • 管理员撤销令牌
  • 服务器不能撤销访问令牌,正如我之前所说的,一旦发布有效期到期,无论如何 - >但是只要用户有访问令牌:P一旦他打开应用程序,就删除访问令牌,如果他没有持续在过去的1个小时左右打开应用程序。现在,前端不得不使用它存储的刷新令牌来获取新的访问令牌。现在,你想让用户强制注销?撤销他的刷新令牌。

    密码更改后的
  • 在所有设备上注销
  • 同2.他改变密码后,撤销颁发的所有刷新令牌(如果你不想用户再次登录,撤销除当前设备之外的所有刷新令牌)。您的所有设备上的应用程序将被迫使用刷新令牌获取新的访问令牌,但由于您已撤销该令牌,因此用户无法使用其凭据登录。

    所有设备

    相同的

  • 用户触发注销为3.更改密码触发上的所有设备注销,在这里你只需要添加一个“退出在所有设备上“按钮,该按钮将发送服务器请求,撤销除当前设备之外的所有刷新令牌。

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


    “这一切很好,但我不希望在第一时间更新权杖”(替代解决方案):

    我不鼓励存储令牌,因为它违背了真正目的通过增加由于查询数据库而增加的响应时间来缩放和防止轻松的DDoS攻击。但是由于Redis是一款运行在内存上的惊人快速键值存储,因此有些人更喜欢在其中存储访问令牌。那么这是如何工作的?

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

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

    2. 如果成功,请检查Redis的令牌。如果它存在,授予访问权限。如果没有,请让用户重新登录。请注意,这将比仅使用JWT授予访问权限稍慢,但是,您并未将其存储在Postgres或Mongo中,这可能需要几毫秒的时间才能响应; Redis是一家关键价值商店 - 因为它位于内存(而不是存储设备)上 - 比这些要快得多。

    当且仅当两个条件都满足时才允许访问:JWT有效。智威汤逊目前在Redis的

    回答您的疑问:

    注销现在是可能的。当用户点击注销时,从Redis中删除访问令牌。即使他拥有访问令牌,他也无法登录。访问令牌现在从字面上无效。

    1. 管理员登出:从Redis中删除该用户的访问令牌。

    用户成功地被授予服务器访问之后,应允许用户发出要求删除所有其他标记使用相同的用户ID(或UID),这将允许注销

    1. 更改密码后,发出这样的请求。

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

    最后冷落1.保持登录状态直到用户注销:现在你有权力无效,你不使用Redis的时候没有访问令牌,你可以有一个5年有效的访问令牌,只要您执行其他所需的安全措施以防止滥用访问令牌。

  • +0

    非常感谢您提供丰富翔实的答案。我认为替代解决方案比原来的要好得多:)你有什么建议采取额外的安全措施来防止滥用访问令牌? – Wonka

    +1

    确保您加密并存储令牌,使其无法通过任何其他应用访问,即使存储可访问;永远不会在url中发送令牌,例如,制作websocket请求 - https://example.com/websocket?令牌= '应该严格避免 –

    +0

    再次谢谢你:) – Wonka