Spring 安全 Oauth2 客户端是否自动处理来自 Spring 授权服务器的刷新令牌?

Does Spring Security Oauth2 Client handles refresh token automatically from Spring Authorization Server?

我正在尝试使用 NextJS + Java 以 Spring 作为我的后端来创建一个应用程序,并且我一直在尝试使用新的 Spring 授权服务器以及 BFF 应用程序 Spring 网关和 Spring 安全 Oauth2 客户端。

我最近一直在研究这个 sample 以尝试为我自己的应用程序实现前端后端模式,并且我遇到了一些关于 Spring 安全 Oauth2 客户端的问题。

  1. 我读过this,它似乎确实自动处理了授权代码、刷新令牌、客户端凭据,如下面的代码所示,但我的问题是,如果它真的通过它自己处理所有事情,特别是刷新令牌等等,我读过一篇关于它的文章,但这是我第一次接触 Oauth2 客户端,我想真正确定它,或者我是否完全迷路了。

    @Bean
    @Primary // Needed because of GatewayReactiveOAuth2AutoConfiguration
    public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
        ReactiveClientRegistrationRepository clientRegistrationRepository,
        ServerOAuth2AuthorizedClientRepository authorizedClientRepository) {
    
    ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
            ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
                    .authorizationCode()
                    .refreshToken()
                    .clientCredentials()
                    .build();
    
    DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager =
            new DefaultReactiveOAuth2AuthorizedClientManager(
                    clientRegistrationRepository, authorizedClientRepository);
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
    
    return authorizedClientManager;
    

    }

  2. 第二个问题是,由于Spring授权服务器保存了RegisteredClient、Authorization和AuthorizationConsent,Backend For Frontend应用程序是否应该以某种方式将令牌存储在数据库中?我从上面的代码中看到了这些存储库,但我不知道是否需要实施和保存。如果我必须使用 BFF 或 Auth 服务器启动多个 pods 以及在处理多个 BFF 实例时如何正确处理我的前端和 BFF 之间的会话,我对它在生产环境中的工作方式感到困惑.

一般来说,您会想分别问每个问题。标题表明您专注于刷新令牌,但您添加了第二个关于持久性的问题。话虽如此,我认为答案很简单,所以我们可以试一试。

#1:

在某种程度上,通过试用示例很容易回答这个问题。这很容易跳过,但这是重要的一步。示例存储库包括一个 gateway/bff、一个 JavaScript 客户端 (angular)、一个资源服务器和一个授权服务器,因此您可以 运行 所有这些并尝试一下。它不是完全最新的,所以现在我建议 运行先按原样安装它。

但简短的回答是肯定的,Spring安全 OAuth2 客户端处理刷新令牌。

repo 中演示了多种可用模式(检查提交),但最简单的是使用 spring 云网关中的 TokenRelay 开始。有关该示例的更多上下文,请参阅 webinar

#2:

持久性是一个微妙的话题,因为它通常取决于您的环境以及您的组织可用或需要的数据库或持久性。开始时(听起来像你)可以忽略持久性,直到你学到足够的知识以适应其他复杂的主题,如 OAuth、Spring 安全、体系结构等。

当然,如果你准备好投入生产,那绝对是时候考虑一​​下了。在那种情况下,是的,bff 应该有一个支持数据存储。您需要查看文档的 core components 部分,重点关注 ServerOAuth2AuthorizedClientRepository 界面。您将实施它以在您的数据库中为 bff 存储和检索授权客户端。

希望这能回答问题,因为您指出了一些普遍的困惑,我不确定问题可能是什么。当你了解更多时,你会想针对每个点提出单独的问题。