【问题标题】:Is it insecure to use OAuth access token as a password for JWT sessions in Spring boot?在 Spring Boot 中使用 OAuth 访问令牌作为 JWT 会话的密码是否不安全?
【发布时间】:2021-05-10 08:57:30
【问题描述】:

我正在努力为我的 SPA 应用程序找到合适的身份验证架构。

我们有

SPA ------OAuth Access Token---> Spring Boot Server
 |
 |
OAuth Authorization Code Flow
 |
\|/
OAuth Provider

SPA 能够从这个特定的 OAuth 提供程序检索 oauth 访问令牌(仅持续 24 小时)。让用户每 24 小时重新登录并不好,因此我们希望让 spring 服务器与用户保持更长的会话时间。当我们的会话到期时,我们可以要求用户再次针对 OAuth 提供者进行身份验证。

此 OAuth 提供程序不提供刷新令牌。

经过身份验证的 SPA 应该与我的 spring 服务器通信以访问资源。

我不确定与 spring 服务器保持会话超过 24 小时的最佳方式。

我过去只有在 Spring Boot 中实现 JWT 会话的经验。所以我的想法是,也许我可以将 oauth 访问令牌传递给服务器,服务器可以验证访问令牌,然后如果成功,可以返回 JWT 令牌以进行长期会话。

这种方法合理吗?还是有更好的办法?

【问题讨论】:

    标签: spring-boot oauth-2.0 oauth


    【解决方案1】:

    很难故意使用 JWT 管理会话 - 使用 JWT 意味着没有针对 API 的会话,因为访问令牌的整个想法是用于访问某些 Web 端点的无状态机制(JWT 使用签名验证)。库、框架等将在每一步都与您抗衡,因为 JWT 并不是真的要用作会话令牌。

    管理令牌的典型方式是让 IdP(或图中的 OAuth 提供者)通过存储在浏览器上的 cookie 来管理会话。

    当访问令牌即将到期时,浏览器会访问 OAuth 提供者,如果用户通过身份验证(这又通过 cookie 确定),该提供者会咳出一个新的访问令牌。

    不幸的是,这意味着您受制于 OAuth 提供者。如果它不会进行会话并且您无法更改其行为,那么您最终会遇到一些 hack 解决方法,例如创建过期时间超过 24 小时的 JWT 访问令牌的端点,它使用来自 OAuth 提供者的令牌,作为 authn/z。

    它是否安全将是一个争论的问题,但我见过比这更糟糕的实现。

    【讨论】:

      【解决方案2】:

      假设您的授权服务器发出刷新令牌,您应该能够使用刷新授权类型来获取新的访问令牌,请参阅:https://www.rfc-editor.org/rfc/rfc6749#section-6

      您建议的方法也是合理的,但接近于为您的 SPA 使用有状态的后端,该后端自行处理 OAuth 2.0 流程并发出会话 cookie 以维护 SPA 和后端之间的会话。后者是在一些现有的服务器软件组件中实现的模式,例如mod_auth_openidc

      【讨论】:

      • 这个特定的 OAuth 服务器不提供刷新令牌。并且访问令牌将在 24 小时内到期。因此要求用户每 24 小时登录一次是不合理的,因此我们希望与我们的 spring 服务器保持会话。我想我是在专门询问如何在 Spring Security 中做到这一点。
      猜你喜欢
      • 2022-01-14
      • 2016-01-19
      • 2020-07-18
      • 2017-02-06
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2015-05-06
      相关资源
      最近更新 更多