Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 2.0 在使用JWT令牌身份验证时,刷新令牌真的有必要吗?_Oauth 2.0_Jwt_Http Token Authentication - Fatal编程技术网

Oauth 2.0 在使用JWT令牌身份验证时,刷新令牌真的有必要吗?

Oauth 2.0 在使用JWT令牌身份验证时,刷新令牌真的有必要吗?,oauth-2.0,jwt,http-token-authentication,Oauth 2.0,Jwt,Http Token Authentication,我正在引用另一篇SO帖子,其中讨论了如何使用JWT的刷新令牌 我有一个应用程序,它有一个非常通用的体系结构,我的客户机(web和移动设备)与RESTAPI通信,然后RESTAPI与服务层和数据层通信 我理解JWT令牌身份验证,但对于如何使用刷新令牌,我有点困惑 我希望我的JWT身份验证具有以下属性: JWT令牌的过期时间为2小时 客户端每小时刷新一次令牌 如果用户令牌未刷新(用户处于非活动状态且应用程序未打开)且过期,则他们需要在任何时候登录以恢复 我看到很多人声称使用刷新令牌的概念使这成为

我正在引用另一篇SO帖子,其中讨论了如何使用JWT的刷新令牌

我有一个应用程序,它有一个非常通用的体系结构,我的客户机(web和移动设备)与RESTAPI通信,然后RESTAPI与服务层和数据层通信

我理解JWT令牌身份验证,但对于如何使用刷新令牌,我有点困惑

我希望我的JWT身份验证具有以下属性:

  • JWT令牌的过期时间为2小时

  • 客户端每小时刷新一次令牌

  • 如果用户令牌未刷新(用户处于非活动状态且应用程序未打开)且过期,则他们需要在任何时候登录以恢复

  • 我看到很多人声称使用刷新令牌的概念使这成为一种更好的体验,但是,我不认为这有什么好处。管理它似乎增加了复杂性

    我的问题如下:

  • 如果我使用一个刷新令牌,那么在该令牌上有一个长期的良好实践到期不是也有好处吗
  • 如果我要使用刷新令牌,该令牌是否会使用userId和/或JWT令牌持久化
  • 当我每1小时更新一次令牌时,这是如何工作的?我想创建一个接收JWT令牌或刷新令牌的端点吗?这将更新我的原始JWT令牌的到期日期,还是创建一个新令牌
  • 鉴于这些细节,是否需要刷新令牌?如果用户只是使用JWT令牌获取新令牌(根据上面的链接),那么刷新令牌就过时了

  • 稍后让我来回答您的问题,并从实际讨论刷新令牌的全部目的开始

    所以情况是:

    用户打开应用程序并提供其登录凭据。现在,应用程序很可能正在与REST后端服务交互。REST是无状态的,没有授权访问API的方法。因此,到目前为止,在讨论中,无法检查授权用户是否正在访问API,或者只是一些随机请求

    现在要解决这个问题,我们需要一种方法来知道请求来自授权用户。所以,我们所做的就是引入一种叫做访问令牌的东西。因此,一旦用户成功通过身份验证,就会向其颁发一个访问令牌。这个令牌应该是一个长且高度随机的令牌(以确保它不被猜测)。这就是JWT出现的地方。现在,您可能/可能不想在JWT令牌中存储任何特定于用户的详细信息。理想情况下,您只需要在JWT中存储非常简单、非常不敏感的细节。JWT哈希的操作以检索其他用户的详细信息(IDOR等)由JWT(正在使用的库)自己负责

    现在,我们的授权访问问题已经解决了

    现在我们讨论一个攻击场景。假设使用上述所有用户Alice,使用应用程序,拥有授权访问令牌,现在她的应用程序可以向所有API发出请求,并根据她的授权检索数据

    假设Alice以某种方式丢失了访问令牌,或者换句话说,对手Bob获得了Alice的访问令牌。现在,尽管未经授权,Bob仍可以向Alice授权的所有API发出请求

    理想情况下我们不想要的东西

    现在,这个问题的解决方案是:

  • 或者检测到有这样的事情发生
  • 减少攻击窗口本身
  • 仅使用访问令牌很难实现上述条件1,因为无论是Alice还是Bob,使用的都是相同的授权令牌,因此无法区分来自两个用户的请求

    因此,我们尝试实现上面的2,因此我们在访问令牌的有效性上添加了一个过期时间,比如说访问令牌在“t”(短期)时间内有效

    这有什么帮助?好吧,即使Bob拥有访问令牌,他也只能在它有效时使用它。一旦过期,他将不得不再次取回它。现在,当然,你可以说他可以像第一次一样得到它。但是,再也没有比100%的安全性更好的了

    上述方法仍然存在问题,在某些情况下是不可接受的。当访问令牌到期时,它将要求用户输入其登录凭据并再次获得授权访问令牌,这至少在移动应用中是一种糟糕的(不可接受的)用户体验

    解决方案:这就是刷新令牌的作用。这也是一个随机的、不可预测的令牌,它首先与访问令牌一起被发布到应用程序。此刷新令牌是一个非常长寿命的特殊令牌,它确保一旦访问令牌过期,它就向服务器请求新的访问令牌,从而在现有的授权访问令牌过期后,用户无需重新输入其登录凭据来检索新的授权访问令牌

    现在您可能会问,Bob也可以访问刷新令牌,类似于他破坏访问令牌的方式。对他可以。然而,现在很容易识别这样的事件,这在单独使用访问令牌的情况下是不可能的,并采取必要的措施来减少所造成的损害

    怎么做?

    对于每个经过身份验证的用户(通常是移动应用程序),会向该应用程序发出一对一的映射刷新令牌和访问令牌对。因此,在任何给定的时间点,对于单个经过身份验证的用户,只有一个访问令牌对应于一个刷新令牌。现在假设Bob破坏了刷新令牌,他将使用它生成一个访问令牌(因为访问令牌是唯一的