gpt4 book ai didi

java - 如何使用 Spring Security 5 在 Spring Boot 应用程序(不是 Web 应用程序)中获取 oauth2 访问 token

转载 作者:行者123 更新时间:2023-12-01 18:30:43 24 4
gpt4 key购买 nike

我需要在 Spring Boot 应用程序的服务层中获取访问 token (grant_type = client_credentials)才能与其他微服务(服务到服务交互)进行通信。这一层没有 spring http session 或 auth,我只有 client_id、client_secret 和 token url。这些属性在 application.properties 中设置为:

spring.security.oauth2.client.registration.auth1.client-id=***
spring.security.oauth2.client.registration.auth1.client-secret=***
spring.security.oauth2.client.registration.auth1.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.auth1.tokenUri=***

这对于 Spring Security OAuth 来说似乎很简单,但对于 Spring security 却无法解决。引用了 Spring Security 5 的文档,但一切似乎都是在 Web 界面的上下文中。我知道我可以通过 http 调用来获取带有我所拥有的信息的 token ,但我想利用该框架...

场景:让我们将此 Spring Boot 应用程序服务称为 A。还有其他服务可能会调用 A 来处理 http 上的更新或发送有关 A 监听的主题的 kafka 消息。当 A 处理更新/消息时,它需要向服务 B 发送一些数据,而服务 B 需要访问 token 进行身份验证。这是我需要访问 token 的地方。因此,交互本质上是服务-服务,而不是特定于用户的。

最佳答案

当不在 Web 界面上下文中时,您需要查看服务层。

来自 Spring Security 的 AuthorizedClientServiceOAuth2AuthorizedClientManager 的 Javadocs:

An implementation of an {@link OAuth2AuthorizedClientManager} that is capable of operating outside of a {@code HttpServletRequest} context, e.g. in a scheduled/background thread and/or in the service-tier.

这是一个可能有帮助的@Bean定义,我将在下面解释:

    @Bean
OAuth2AuthorizedClientManager authorizedClientManager
(ClientRegistrationRepository clients) {
OAuth2AuthorizedClientService service =
new InMemoryOAuth2AuthorizedClientService(clients);
AuthorizedClientServiceOAuth2AuthorizedClientManager manager =
new AuthorizedClientServiceOAuth2AuthorizedClientManager(clients, service);
OAuth2AuthorizedClientProvider authorizedClientProvider =
OAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials()
.build();
manager.setAuthorizedClientProvider(authorizedClientProvider);
return manager;
}

OAuth2AuthorizedClientManager 管理授权 OAuth 2.0 客户端定义。这些定义存储在 ClientRegistrationRepository 中,并且 Spring Boot 通过您已定义的属性创建 ClientRegistrationRepository 的默认实例。

经理通常需要两件事才能发挥作用:

  • 第一个是 OAuth2AuthorizedClientService,如果您想将 token 存储在数据库中,它会很方便 - 在 Spring Security 5.2 中,唯一的实现是内存中的;然而,5.3 似乎将附带 a JDBC implementation .

  • 第二个是 OAuth2AuthorizedClientProvider,它实际上执行 token 请求,例如您想要创建的客户端凭据。

创建此管理器后,您可以将其连接到您的网络客户端:

    @Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
new ServletOAuth2AuthorizedClientExchangeFilterFunction
(authorizedClientManager);
oauth2.setDefaultClientRegistrationId("auth1");
return WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
}

上面使用的交换过滤器函数是将不记名 token 添加到Authorization header 中。它调用管理器要求其提供 token ,管理器从服务中提取它。如果过期,经理会要求提供商刷新。现在,使用新的 token ,管理器将其交还给过滤器以将其添加到请求中。

关于java - 如何使用 Spring Security 5 在 Spring Boot 应用程序(不是 Web 应用程序)中获取 oauth2 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com