authentication - OAuth 2.0 刷新 token 多个选项卡

标签 authentication oauth-2.0 jwt race-condition refresh-token

在使用 OAuth 2.0 JWT 刷新 token 实现时,我遇到了一个问题,即在 Web 浏览器客户端上实现可靠的刷新策略真的很困难。多个选项卡可能会导致请求出现竞争情况。

RFC 没有明确提到服务器端的刷新 token 仅对一个(第一个)请求有效,但我认为在使用刷新 token 时使它们无效是一个好主意。

堆栈溢出已经有多个“解决方案”,但似乎没有一个是直接的。

一种解决方案是向请求添加抖动并通过本地存储同步请求。

如果我理解正确,您会在请求启动时将变量放入本地存储,其他选项卡检查是否设置了此变量,然后不开始刷新?你知道这个的示例实现吗?也许在 React 中?

最佳答案

上面的答案并没有真正回答这个问题:

  • 使用 OIDC 客户端库并没有解决这个问题,事实上据我所知它甚至不使用刷新 token 。
  • 在内存或 session 存储中存储 token 并不能解决问题,但会产生更多,见下文。
  • 在某些情况下,使用 AS 的 session cookie 是不可行的。通常这是一个跨域 cookie,不能在其他站点上可靠地使用。这个概念被称为“静默更新”,需要在 iframe 中使用跨域 cookie 来刷新 token (使用 AS session )。这个概念听起来不错,但是随着浏览器和用户阻止越来越多的跨域跟踪机制,这使用起来确实很危险:在大多数情况下,无法检测到被阻止的 cookie(这会导致几秒钟后突然注销,尤其是在使用 OIDC 时) session 管理机制. 刷新 token 时通过 AS 重定向也不是一种选择,因为在许多情况下, token 是 JWT 并且仅在几分钟内有效,并且每隔几分钟重定向离开应用程序来破坏体验也不是一种选择。

  • 通过浏览器中的 PKCE 和授权代码流,可以使用和存储刷新 token ,但正如原始海报所说,刷新时必须小心(特别是当刷新 token 只能使用一次时,这是浏览器环境所需要的!)...

    关于authentication - OAuth 2.0 刷新 token 多个选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61815011/

    相关文章:

    reactjs - 使用 React 进行 Kerberos 身份验证

    bash - wget 使用不正确的名称/类型保存文件。为什么?

    rsa - 使用 at_hash 验证访问 token

    asp.net-mvc-5 - IdentityServer 4 连接 MVC5 作为客户端

    redis - 是否有充分的理由不将密码重置 token 存储在像 Redis 这样的键值存储中?

    authentication - chrome.identity.launchWebAuthFlow 能否用于针对 Google API 进行身份验证?

    eclipse - NTLM 身份验证适用于 eclipse,但 tomcat 给出 401 未授权

    azure - 给定 Azure 端点域 : Hash versus *. onmicrosoft

    spring - JSON Web Token (JWT) 和基于 Spring 的 SockJS/STOMP Web Socket

    angularjs - 委托(delegate)刷新 token 获取新JWT的基本策略