The*_*boy 27 oauth-2.0 jwt http-token-authentication
I am referencing another SO post that discusses using refresh tokens with JWT.
JWT (JSON Web Token) automatic prolongation of expiration
I have an application with a very common architecture where my clients (web and mobile) talk to a REST API which then talks to a service layer and data layer.
I understand JWT token authentication, but I am a little confused at how I should use refresh tokens.
I want my JWT authentication to have the following properties:
JWT Token has expiration of 2 hours.
Token is refreshed every one hour by client.
If user token is not refreshed (user is inactive and app is not open) and expires, they will need to login whenever they want to resume.
I see a lot of people claiming to make this a better experience using the concept of a refresh token, however I don't see the benefit of this. It seems like an added complexity having to manage it.
My questions are the following:
qre*_*0ct 43
让我稍后回答你的问题,然后开始讨论刷新令牌的整个目的.
所以情况是:
用户打开应用程序并提供其登录凭据.现在很可能该应用程序正在与REST后端服务进行交互.REST是无状态的,没有办法授权访问API.因此,到目前为止,在讨论中,没有办法检查授权用户是否实际访问API,或者只是一些随机请求通过.
现在,为了能够解决这个问题,我们需要一种方法来了解请求来自授权用户.所以,我们所做的是引入一种称为访问令牌的东西.因此,一旦用户成功通过身份验证,他就会获得一个访问令牌.这个令牌应该是一个长且高度随机的令牌(以确保它不会被猜到).这就是JWT进入画面的地方.现在,您可能/可能不想在JWT令牌中存储任何特定于用户的详细信息.理想情况下,您只想在JWT中存储非常简单,极其非敏感的细节.JWT(正在使用的库)本身处理JWT哈希的操作以检索其他用户的详细信息(IDOR等).
所以目前我们的授权访问问题已经解决了.
现在我们谈谈一个攻击场景.假设使用上述所有用户,Alice使用该应用程序拥有授权访问令牌,现在她的应用程序可以向所有API发出请求并根据其授权检索数据.
假设SOMEHOW Alice失去了访问令牌或换了另一种方式,攻击者Bob可以访问Alice的访问令牌.现在Bob尽管未经授权,但实际上可以向Alice授权的所有API发出请求.
我们理所当然地想要一些东西.
现在解决这个问题的方法是:
仅使用访问令牌,很难实现上面的条件1,因为无论是Alice还是Bob,它都是使用的相同授权令牌,因此两个用户的请求是不可区分的.
所以我们尝试实现上面的2,因此我们为访问令牌的有效性添加了一个到期,比如访问令牌对't'(短暂的)时间有效.
它有什么用?好吧,即使Bob拥有访问令牌,他也只能使用它直到它有效.一旦到期,他将不得不再次检索它.现在,你可以说他可以像第一次得到它一样得到它.但话说再说没有100%安全!
上述方法仍存在问题,在某些情况下实际上是不可接受的.当访问令牌到期时,它将要求用户输入他的登录凭证并再次获得授权访问令牌,至少在移动应用的情况下,这是不好的(不可接受的)用户体验.
解决方案:这是刷新令牌进入的位置.它也是一个随机不可预测的令牌,它也首先与访问令牌一起发布给应用程序.此刷新令牌是一个非常长期存在的特殊令牌,它确保一旦访问令牌到期,它就会向服务器请求新的访问令牌,从而无需用户重新输入其登录凭据以检索新的授权访问令牌,一旦现有的已到期.
现在您可能会问,Bob也可以访问刷新令牌,类似于他破坏访问令牌的方式.是.他可以.然而,现在很容易识别出这种情况,这在单独的访问令牌的情况下是不可能的,并采取必要的行动来减少所造成的损害.
怎么样 ?
对于每个经过身份验证的用户(通常是移动应用程序),会向应用程序发出一对一映射刷新令牌和访问令牌对.因此,在任何给定的时间点,对于单个经过身份验证的用户,将只有一个访问令牌对应于刷新令牌.现在假设如果Bob已经破坏了刷新令牌,他将使用它来生成访问令牌(因为访问令牌是唯一被授权通过API访问资源的东西).一旦Bob(攻击者)使用新生成的访问令牌发出请求,因为Alice的(真实用户)访问令牌仍然有效,服务器会将此视为异常,因为对于单个刷新令牌,只能有一个授权一次访问令牌.识别异常,服务器将销毁有问题的刷新令牌,并且与之相关的所有相关访问令牌也将失效.从而防止任何进一步的访问,无论是真正的还是恶意的,都需要资源的任 用户Alice需要再次使用她的凭证进行身份验证并获取有效的刷新和访问令牌.
当然,您仍然可以争辩说Bob可以再次访问刷新和访问令牌,并重复上面的整个故事,可能导致真正的客户Alice的DoS,但是再一次没有100%的安全性.
同样作为一个好习惯,刷新令牌也应该有一个到期,虽然很长.
ale*_*emb 10
如果我要使用刷新令牌,那么长期过期对于该令牌的良好实践是否仍然有益?
刷新令牌是长期存在的,访问令牌是短暂的。
如果我要使用刷新令牌,该令牌是否会与 userId 和/或 JWT 令牌一起保留?
它将作为单独的令牌与 JWT 一起保留在客户端上,但不在 JWT 内部。UserID/UID 可以存储在 JWT 令牌本身内。
当我每 1 小时更新一次令牌时,这是如何工作的?我是否想要创建一个接受 JWT 令牌或刷新令牌的端点?这会更新我的原始 JWT 令牌的到期日期,还是创建一个新令牌?
是的,您需要一个单独的服务来颁发和刷新令牌。它不会更新现有 JWT 令牌的到期时间。令牌只是经过 Base64 编码的 JSON 字段值对。因此改变数据就会改变输出。代币还有发行日期,该日期至少会在每次新发行(刷新)时发生变化。因此,每个代币都将是独特且新颖的。旧令牌将自动过期,因此您需要所有访问令牌过期,否则它们将永远徘徊。
这里的另一个答案指出,当您发行新令牌时,旧令牌会被销毁。事实并非如此。代币不能被销毁。事实上,您可以通过不断联系身份验证服务器并使用刷新令牌请求新的新鲜令牌来收获数百个令牌。每个访问令牌将在到期前有效。所以到期是必要的,而且应该是短的。
考虑到这些详细信息,真的需要刷新令牌吗?看来,如果用户只是使用 JWT 令牌来获取新令牌(根据上面的链接),那么刷新令牌就已过时。
JWT 令牌有客户声明。例如,is_manager:true对 JWT 令牌的声明可能允许访问经理级别的功能。现在,如果您决定将用户从经理降级为承包商,这不会立即生效。用户可能仍在使用旧令牌。最后,当过期时,他会访问身份验证服务器来刷新他的令牌。身份验证服务器在没有管理声明的情况下颁发新令牌,用户将无法再访问管理功能。这会创建一个窗口,在此期间用户的声明与服务器不同步。这再次解释了为什么访问令牌应该是短暂的,因此同步可以经常发生。
本质上,您每 15 分钟更新一次授权检查,而不是对每个请求进行检查(这是典型的基于会话的身份验证的工作方式)。如果您想要实时权限而不是每 15 分钟刷新一次,那么JWT 可能不太适合。
小智 8
我相信在这种情况下,您可以单独使用访问令牌,使您的客户的生活更轻松,同时保持刷新令牌的安全优势.
这是它的工作方式:
当您的用户使用凭据(用户名/密码)登录时,您将返回短暂的JWT.您还可以创建存储的db记录:
valid标志(默认为TRUE)您的客户在每个请求中提交JWT.只要JWT没有过期,它就可以访问资源.如果JWT过期,则在后台刷新它并返回资源和X-JWT新JWT 的附加标头.
当客户端收到带有X-JWT标头的响应时,它会丢弃旧的JWT并将新的JWT用于将来的请求.
valid标志是否仍然为真,否则拒绝.updatedAtdb记录中的字段.此设计还允许您为用户撤消所有令牌(例如,如果用户丢失手机或更新其密码).
X-JWT响应中的标头.| 归档时间: |
|
| 查看次数: |
6834 次 |
| 最近记录: |