【问题标题】:Revoking JWT with No Expiration撤销没有过期的 JWT
【发布时间】:2019-04-14 00:47:26
【问题描述】:

我希望为移动应用程序采用基于令牌的身份验证,只要用户没有注销,就可以保持登录状态。我的方法是在用户登录/注册时创建一个 JWT 刷新令牌;此令牌永不过期,并会持续刷新 20 分钟访问令牌。

问题出现在他们注销时。我已经阅读了解决此问题的最佳方法是将 Redis 上的 JWT 列入黑名单以存储已撤销的密钥。但是,由于 JWT 永不过期,因此该记录永远无法从 Redis 中删除,并且会开始占用我的大量内存。

我应该担心这一点,还是 Redis 在这方面内存效率高?有没有更好的方法来撤销没有过期的 JWT?

【问题讨论】:

    标签: authentication oauth-2.0 jwt


    【解决方案1】:

    JWT 令牌是自包含令牌。这意味着它在到期之前一直独立存在并且不能被撤销。因此,根据定义,它必须过期。因为当它落入坏人之手时,它会提供对您资源的访问权限而无法撤销它。所以是的,你应该担心这个实现。

    这里的问题是您信任刷新令牌本身,因为它是 JWT。您实际上应该信任服务器。不是因为 JWT 不可信,而是因为刷新令牌不一定是 JWT。

    在内存中保存刷新令牌,包括过期时间。您可以从内存中删除过期的令牌。这意味着只有内存中存在的令牌才能用于请求新的访问令牌。为了安全起见,请仅使用一次性刷新令牌。

    流程是这样的:

    1. 用户登录,收到一个 JWT 访问令牌(5 分钟)和刷新令牌 1 代码(48 小时)。刷新令牌 1 保存在服务器上。
    2. 五分钟后:访问令牌过期
    3. 使用刷新令牌 1 请求新的访问令牌。
    4. 用户收到一个新的访问令牌(5 分钟)和刷新令牌 2 代码(48 小时)。令牌 1 从内存中移除,令牌 2 被添加到内存中。
    5. 这会持续几个小时。
    6. 用户两天没有使用应用程序
    7. 50 小时后:因为两个令牌都已过期,用户必须再次登录。重置流程。

    注销时从内存中删除刷新令牌。如果在此期间您希望撤销访问权限。只需从内存中删除刷新令牌。在 5 分钟内,用户必须再次登录。

    【讨论】:

    • 刷新令牌不会授予对资源的访问权限,仅授予身份验证服务器以获取访问密钥。同样对于移动应用程序,通常的做法是根本不让您退出。像 Facebook 或 Snapchat 一样,您将永远保持登录状态。您建议如何实现此功能?
    猜你喜欢
    • 2015-11-02
    • 2020-05-18
    • 2022-09-23
    • 2019-06-05
    • 2015-12-13
    • 2016-06-16
    • 2017-11-09
    • 2023-03-15
    相关资源
    最近更新 更多