diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index b5bc1f4cd39e..6c196fed83bf 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -3,6 +3,9 @@ ## 4.5.0-beta.2 (Unreleased) Upgrade Spring Boot dependencies version to 2.7.4 and Spring Cloud dependencies version to 2021.0.4 +### Bugs Fixed +- Fix bug: The parameter 'scope' is duplicated. [31191](https://github.com/Azure/azure-sdk-for-java/issues/31191). + ## 4.4.0 (2022-09-26) Upgrade Spring Boot dependencies version to 2.7.3 and Spring Cloud dependencies version to 2021.0.3 Upgrade Spring Boot dependencies version to 2.7.2 and Spring Cloud dependencies version to 2021.0.3. diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreator.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreator.java index 6cf836892cba..6062e00889ab 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreator.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreator.java @@ -5,14 +5,11 @@ import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.converter.FormHttpMessageConverter; -import org.springframework.http.converter.HttpMessageConverter; import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; import org.springframework.util.Assert; import org.springframework.web.client.RestTemplate; -import java.util.List; - /** * Util class used to create {@link RestTemplate}s for all Azure AD related http requests. */ @@ -27,25 +24,12 @@ public static RestTemplate createRestTemplate(RestTemplateBuilder builder) { } public static RestTemplate createOAuth2ErrorResponseHandledRestTemplate(RestTemplateBuilder builder) { - RestTemplate restTemplate = createRestTemplate(builder); - restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); - return restTemplate; + builder = builder.errorHandler(new OAuth2ErrorResponseErrorHandler()); + return createRestTemplate(builder); } public static RestTemplate createOAuth2AccessTokenResponseClientRestTemplate(RestTemplateBuilder builder) { - RestTemplate restTemplate = createOAuth2ErrorResponseHandledRestTemplate(builder); - List> converters = restTemplate.getMessageConverters(); - if (notContainsElementOfType(converters, FormHttpMessageConverter.class)) { - converters.add(new FormHttpMessageConverter()); - } - if (notContainsElementOfType(converters, OAuth2AccessTokenResponseHttpMessageConverter.class)) { - converters.add(new OAuth2AccessTokenResponseHttpMessageConverter()); - } - return restTemplate; - } - - private static boolean notContainsElementOfType(List list, Class clazz) { - return list.stream().noneMatch(item -> item.getClass().equals(clazz)); + builder = builder.messageConverters(new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter()); + return createOAuth2ErrorResponseHandledRestTemplate(builder); } - } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/jackson/SerializerUtils.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/jackson/SerializerUtils.java index f5ba0fde806c..d59d68b54be5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/jackson/SerializerUtils.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/jackson/SerializerUtils.java @@ -10,14 +10,13 @@ import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; import org.springframework.security.oauth2.client.jackson2.OAuth2ClientJackson2Module; -import java.util.HashMap; +import java.util.Collections; import java.util.Map; public final class SerializerUtils { private static final ObjectMapper OBJECT_MAPPER; private static final TypeReference> TYPE_REFERENCE = - new TypeReference>() { - }; + new TypeReference<>() {}; static { OBJECT_MAPPER = new ObjectMapper(); @@ -45,7 +44,7 @@ public static String serializeOAuth2AuthorizedClientMap(Map deserializeOAuth2AuthorizedClientMap(String authorizedClientsString) { if (authorizedClientsString == null) { - return new HashMap<>(); + return Collections.emptyMap(); } Map authorizedClients; try { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java index af91381bb842..b9028f122cbf 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter.java @@ -4,12 +4,11 @@ package com.azure.spring.cloud.autoconfigure.aad.implementation.oauth2; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; -import org.springframework.core.convert.converter.Converter; import org.springframework.http.HttpHeaders; -import org.springframework.http.RequestEntity; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequestEntityConverter; import org.springframework.util.MultiValueMap; +import org.springframework.util.MultiValueMapAdapter; import java.util.Collections; import java.util.UUID; @@ -20,6 +19,11 @@ public abstract class AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter extends OAuth2AuthorizationCodeGrantRequestEntityConverter { + protected AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter() { + addHeadersConverter(this::getHttpHeaders); + addParametersConverter(this::getHttpBody); + } + /** * Gets the application ID. * @@ -27,23 +31,11 @@ public abstract class AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter */ protected abstract String getApplicationId(); - @Override - @SuppressWarnings("unchecked") - public RequestEntity convert(OAuth2AuthorizationCodeGrantRequest request) { - addHeadersConverter(headersConverter); - addParametersConverter(parametersConverter); - return super.convert(request); - } - - private final Converter headersConverter = (request) -> getHttpHeaders(); - - private final Converter> parametersConverter = this::getHttpBody; - /** * Additional default headers information. * @return HttpHeaders */ - public HttpHeaders getHttpHeaders() { + public HttpHeaders getHttpHeaders(OAuth2AuthorizationCodeGrantRequest request) { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.put("x-client-SKU", Collections.singletonList(getApplicationId())); httpHeaders.put("x-client-VER", Collections.singletonList(AzureSpringIdentifier.VERSION)); @@ -57,6 +49,6 @@ public HttpHeaders getHttpHeaders() { * @return MultiValueMap */ public MultiValueMap getHttpBody(OAuth2AuthorizationCodeGrantRequest request) { - return null; + return new MultiValueMapAdapter<>(Collections.emptyMap()); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/JacksonHttpSessionOAuth2AuthorizedClientRepository.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/JacksonHttpSessionOAuth2AuthorizedClientRepository.java index 4516ec6e1151..60de8775c36b 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/JacksonHttpSessionOAuth2AuthorizedClientRepository.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/JacksonHttpSessionOAuth2AuthorizedClientRepository.java @@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -48,10 +49,10 @@ public void saveAuthorizedClient(OAuth2AuthorizedClient authorizedClient, Authen Assert.notNull(authorizedClient, "authorizedClient cannot be null"); Assert.notNull(request, MSG_REQUEST_CANNOT_BE_NULL); Assert.notNull(response, "response cannot be null"); - Map authorizedClients = this.getAuthorizedClients(request); - authorizedClients.put(authorizedClient.getClientRegistration().getRegistrationId(), authorizedClient); + Map authorizedClientsMap = new HashMap<>(this.getAuthorizedClients(request)); + authorizedClientsMap.put(authorizedClient.getClientRegistration().getRegistrationId(), authorizedClient); request.getSession().setAttribute(AUTHORIZED_CLIENTS_ATTR_NAME, - serializeOAuth2AuthorizedClientMap(authorizedClients)); + serializeOAuth2AuthorizedClientMap(Collections.unmodifiableMap(authorizedClientsMap))); } @Override diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java index 054a22267433..5bc4219b9112 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java @@ -43,22 +43,23 @@ void testAadRestOperationConfiguration() { RestTemplate restTemplate = createRestTemplate(builder); ResponseErrorHandler handler = restTemplate.getErrorHandler(); - assertNotEquals(handler.getClass(), OAuth2ErrorResponseErrorHandler.class); + assertNotEquals(OAuth2ErrorResponseErrorHandler.class, handler.getClass()); List> converters = restTemplate.getMessageConverters(); assertFalse(hasItemOfClass(converters, FormHttpMessageConverter.class)); assertFalse(hasItemOfClass(converters, OAuth2AccessTokenResponseHttpMessageConverter.class)); restTemplate = createOAuth2ErrorResponseHandledRestTemplate(builder); handler = restTemplate.getErrorHandler(); - assertEquals(handler.getClass(), OAuth2ErrorResponseErrorHandler.class); + assertEquals(OAuth2ErrorResponseErrorHandler.class, handler.getClass()); converters = restTemplate.getMessageConverters(); assertFalse(hasItemOfClass(converters, FormHttpMessageConverter.class)); assertFalse(hasItemOfClass(converters, OAuth2AccessTokenResponseHttpMessageConverter.class)); restTemplate = createOAuth2AccessTokenResponseClientRestTemplate(builder); handler = restTemplate.getErrorHandler(); - assertEquals(handler.getClass(), OAuth2ErrorResponseErrorHandler.class); + assertEquals(OAuth2ErrorResponseErrorHandler.class, handler.getClass()); converters = restTemplate.getMessageConverters(); + assertEquals(2, converters.size()); assertTrue(hasItemOfClass(converters, FormHttpMessageConverter.class)); assertTrue(hasItemOfClass(converters, OAuth2AccessTokenResponseHttpMessageConverter.class)); }); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/webapp/AadOAuth2AuthorizationCodeGrantRequestEntityConverterTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/webapp/AadOAuth2AuthorizationCodeGrantRequestEntityConverterTests.java index 1e110859858b..9ad09f0d9667 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/webapp/AadOAuth2AuthorizationCodeGrantRequestEntityConverterTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/webapp/AadOAuth2AuthorizationCodeGrantRequestEntityConverterTests.java @@ -97,7 +97,7 @@ private HttpHeaders convertedHeaderOf(AadClientRegistrationRepository repository private Object[] expectedHeaders(AadClientRegistrationRepository repository) { return new AadOAuth2AuthorizationCodeGrantRequestEntityConverter(repository.getAzureClientAccessTokenScopes()) - .getHttpHeaders() + .getHttpHeaders(null) .entrySet() .stream() .filter(entry -> !entry.getKey().equals("client-request-id"))