From b174e3f17761c9cecd616598114118b437e916b8 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Fri, 24 Jan 2025 12:50:14 +0100 Subject: [PATCH] OZG-4095 config: Configure proxy --- .../osiv2/config/ApiClientConfiguration.java | 49 ++++++++++++++----- .../OsiPostfachRemoteServiceRemoteITCase.java | 4 +- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java index d8671c1..2cb4f19 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java @@ -10,14 +10,17 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder; import org.springframework.security.oauth2.client.endpoint.RestClientClientCredentialsTokenResponseClient; +import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.client.OAuth2ClientHttpRequestInterceptor; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClient; @@ -53,30 +56,40 @@ public class ApiClientConfiguration { new OAuth2ClientHttpRequestInterceptor(authorizedClientManager(clientRegistrations)); requestInterceptor.setClientRegistrationIdResolver(request -> "osi2"); - return RestClient.builder() + return defaultRestClientBuilder() .requestInterceptor(requestInterceptor) .build(); } + private RestClient.Builder defaultRestClientBuilder() { + return RestClient.builder() + .requestFactory(createProxyRequestFactory()); + } + private ClientHttpRequestFactory createProxyRequestFactory() { var requestFactory = new HttpComponentsClientHttpRequestFactory(); if (proxyConfiguration.isEnabled()) { - var credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials( - new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()), - //TODO: hier brauchen wir noch eine Ordentliche Lösung - // new UsernamePasswordCredentials(proxyConfiguration.getUsername(), proxyConfiguration.getPassword().toCharArray()) - new UsernamePasswordCredentials("", "".toCharArray()) + requestFactory.setHttpClient( + HttpClientBuilder.create() + .setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort())) + .setDefaultCredentialsProvider(basicCredentialsProviderForProxy()) + .build() ); - var httpClient = HttpClientBuilder.create() - .setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort())) - .setDefaultCredentialsProvider(credsProvider) - .build(); - requestFactory.setHttpClient(httpClient); } return requestFactory; } + private BasicCredentialsProvider basicCredentialsProviderForProxy() { + var credentialsProvider = new BasicCredentialsProvider(); + var username = proxyConfiguration.getUsername(); + var password = proxyConfiguration.getPassword(); + if (username != null && password != null) { + credentialsProvider.setCredentials(new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()), + new UsernamePasswordCredentials(username, password.toCharArray())); + } + return credentialsProvider; + } + private AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientManager( ClientRegistrationRepository clientRegistrations) { var clientService = new InMemoryOAuth2AuthorizedClientService( @@ -99,10 +112,22 @@ public class ApiClientConfiguration { private RestClientClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() { var client = new RestClientClientCredentialsTokenResponseClient(); + configureClientCredentialsRestClient(client); configureParametersForTokenRequests(client); return client; } + private void configureClientCredentialsRestClient(RestClientClientCredentialsTokenResponseClient client) { + client.setRestClient(defaultRestClientBuilder() + .messageConverters(messageConverters -> { + messageConverters.clear(); + messageConverters.add(new FormHttpMessageConverter()); + messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter()); + }) + .defaultStatusHandler(new OAuth2ErrorResponseErrorHandler()) + .build()); + } + private void configureParametersForTokenRequests(RestClientClientCredentialsTokenResponseClient client) { client.addParametersConverter(source -> { MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java index 6012b3c..9978f98 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java @@ -83,8 +83,10 @@ public class OsiPostfachRemoteServiceRemoteITCase { @Test void shouldReceiveAllMessage(){ Stream<PostfachNachricht> allMessages = osiPostfachRemoteService.getAllMessages(); + var messages = allMessages.toList(); - assertThat(messages.size() > 0); + + assertThat(messages).isNotEmpty(); } } -- GitLab