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 d8671c16c8bb355a4997ee1e33db445801f66881..2cb4f19a79094f301f5a68c5cac5be7bca2f0dcc 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 6012b3c7a331124e0c4403b82ccf38e6ae86c644..9978f987a8d331528a8a8b86b4bf1ed0b21348a4 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(); } }