当前位置: 首页 > 知识库问答 >
问题:

如何在移动应用环境中处理JWT刷新令牌

关正雅
2023-03-14

我正在使用单独的后端服务器在客户端移动应用程序中实现JWT,我正在寻找一种最佳方式来使用刷新令牌,而无需过多的服务器调用,同时保持良好的用户体验。

我对实现这样一种机制还很陌生,我对很多事情都感到困惑,所以我真正想要的是一个可靠的概念解决方案,以确保用户访问应用程序,并让他同时无限期登录。

任何更正或建议都将受到欢迎:

>

  • 为什么要刷新令牌?

    单独使用JWT访问令牌可能会危及用户安全性:如果攻击者持有访问令牌,他可能会随时运行功能请求。即使在对访问令牌应用到期日期时,如果服务器在旧访问令牌到期时发出新的访问令牌,攻击者也会使用他的旧访问令牌收到这个新的访问令牌,并继续访问用户功能。

    一旦用户使用其登录名/密码重新访问其帐户,刷新令牌将阻止攻击者:当用户使用应用程序且服务器检测到其刷新令牌无效时,他将注销,并在使用凭据登录后颁发新的刷新令牌和访问令牌。攻击者将无法使用旧令牌。

    我的第一个问题是:

    一、 无论攻击者如何从用户环境中获取令牌,只要用户仍然处于非活动状态并且没有使用其凭据再次登录以创建新令牌,他是否能够无限期地使用这些令牌?

    当令牌html" target="_blank">异步刷新时会发生什么情况?

    让我们想象一个场景,其中用户在应用程序内部,并且至少有两个服务器调用异步运行:

    • “Service1”使用过期的accessToken1和刷新token1进行服务器调用,服务器通过发送新的accessToken2和刷新token2进行响应
    • 在收到“Service1”响应之前,“Service2”使用accessToken1和刷新token1进行另一个服务器调用,服务器将刷新token1与之前保存的刷新token2进行比较,发现它们不同。然后,它会以无效的刷新令牌响应,这会导致用户注销

    为了避免这个问题并保持用户登录,可以有一个集中式身份验证服务,在进行任何服务器调用之前首先检查令牌的有效性。这意味着除非身份验证服务空闲,否则任何调用都不会执行,或者如果已经在加载新令牌,则等待新令牌。

    我的第二个问题是:

    二、使用这样的服务来避免异步刷新令牌问题意味着到服务器的往返次数更多,这可能代价高昂。有更好的解决方案吗?

  • 共有1个答案

    唐晗昱
    2023-03-14

    登录/撤销对api的访问有以下步骤:

    • 登录时,向客户端发送2个令牌(访问令牌、刷新令牌)
    • 访问令牌将具有较少的到期时间,刷新将具有较长的到期时间
    • 客户端(前端)将刷新令牌存储在本地存储器中,访问令牌存储在cookie中
    • 客户端将使用访问令牌来调用API。但当它过期时,从本地存储中选择刷新令牌并调用auth-server-API来获取新令牌
    • 您的身份验证服务器将公开一个API,该API将接受刷新令牌并检查其有效性,然后返回一个新的访问令牌
    • 刷新令牌过期后,用户将注销

    JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名——例如,使用公钥/私钥对——所以您可以确定发件人是他们所说的那个人。此外,由于签名是使用标头和有效负载计算的,您还可以验证内容没有被篡改。

    当令牌异步刷新时会发生什么情况?

    这应该通过对endpoint的单个请求来完成,因此只有一个accessToken

    使用这样的服务来避免异步刷新令牌问题意味着到服务器的往返次数更多,这可能代价高昂。有更好的解决方案吗?

    我认为这是最好的

    有关更多信息,请检查[问题]:JWT刷新令牌流

    以下是JWT的官方介绍

     类似资料:
    • 在我的REST API中,我有一个过滤器,该过滤器检查每个请求,以查看令牌是否是原样。下面是代码。 当用户登录到应用程序时,将调用上述代码。但是,令牌将在60分钟内过期。我知道,在令牌过期后,要么我必须带用户返回登录屏幕,要么刷新令牌。我把这里和这里的建议都看了一遍 但我不明白以下几点。 如何分配并将此令牌发送回用户?当前,当用户登录时,他将获得令牌并将其保存在一个变量中。为了使刷新的令牌工作,我

    • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作

    • 我遇到的问题是,和操作都将刷新令牌,因为在分派时,令牌将过期。理想情况下,我希望“暂停”需要身份验证的操作,直到令牌刷新。有没有一种方法可以用中间件做到这一点?

    • 我正在尝试使用 GraphQL 使用 JWT 对用户进行身份验证。登录用户后,我会收到令牌作为 JSON 响应和存储刷新令牌的 httponly cookie。(服务器端使用的是销售核心) 从Saleor的文档和其他一些博客帖子中,我假设这个响应cookie现在应该存储在浏览器中,每当我需要刷新令牌时,cookie refreshToken将用于验证我的请求。然而,当我在开发工具中将选项卡切换到“

    • 我使用jwt为用户在我的应用程序上执行操作提供授权。它工作得很好,因为我不必访问数据库来查看用户是否有效。我在jwt中遇到的问题是,当令牌过期时,用户必须再次登录。在网上阅读我一直在阅读刷新令牌可以用来解决这个问题,但没有白痴证明解释它如何工作。它们是如何工作的?需要数据库访问吗?

    • 首先,让我承认我是API新手,现在我正在和Laravel一起研究JWT。我使用的是tymon\jwt auth(