Spring WebClient和client_credentials授予

时间:2018-10-02 18:55:01

标签: java spring spring-security spring-security-oauth2

我的问题仅针对 spring-security 5.1.0 和使用Spring WebClient。我正在使用Spring Boot 2.1.0在服务器环境中工作。这个question可能已经被问到了,但当时无法回答。

通读spring-security 5.1.0 release notes,似乎他们已经添加了对client_credentials身份验证流的支持,特别是将其添加到WebClient Bean中,因此最终用户不必担心auth令牌。我正试图做到这一点,但API /文档使我完全迷失了。我当前的工作在下面...

private ClientRegistration clientRegistration() {
    return ClientRegistration.withRegistrationId("registration-id")
        .clientId("client-id")
        .clientSecret("secret")
        .tokenUri("token-url")
        .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
        .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
        .scope("scopes")
        .build();
}

@Bean
public WebClient webClient() {
    ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(this.clientRegistration());
    OAuth2AuthorizedClientService oAuth2AuthorizedClientService = new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);
# These are unused ^ but pieces of documentation seem to indicate they are required

    return WebClient.builder()
        .filter(new ServerOAuth2AuthorizedClientExchangeFilterFunction()) # this requires 2 arguments that I do not have
        .build();
}

我的最终目标是能够在任何地方自动装配WebClient bean,并简单地发出自动添加了 bearer 身份验证的请求。

1 个答案:

答案 0 :(得分:1)

随着Spring Security 5.1为OAuth2身份验证机制添加了更简单的实现,我建议您看一下最近的这篇文章:StackOverflow - Spring Security 5.1 - Get token for client credentials flow with WebClient

从现在开始,您不需要管理任何ClientRegistration。可以使用属性设置所有内容。

然后,对于WebClient实例化,需要从Spring注入ClientRegistrationRepository,并且您需要使用UnAuthenticatedServerOAuth2AuthorizedClientRepository的新实例,因为您没有将任何用户附加到应用程序进程中。这样,您将拥有ServerOAuth2AuthorizedClientExchangeFilterFunction所需的两个参数。

我试图提出一种方案,其中客户端应用程序正在GitHUb存储库GitHub - Spring Security OAuth2 Machine-To-Machine process中使用WebClient从OAuth2安全端点上的资源服务器请求数据。现在,使用Spring Security 5.1确实很容易进行身份验证。

请问您是否有任何疑问。希望对您有帮助!