From 5470386ab68b18e0c9f025faa8fd01b220d31376 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Thu, 29 Sep 2022 17:57:51 +0800 Subject: [PATCH 1/8] Fix issue 31191: duplicated scopes. 1. For RestTemplate used to get access token, only keep 2 converters: FormHttpMessageConverter and OAuth2AccessTokenResponseHttpMessageConverter. Because keep more converters may cause the 2 converters not been used. 2. Return new HashMap() instead of Collections.emptyMap(). Because the returned value needs to add new values, but Collections.emptyMap() does not support add new value. --- sdk/spring/CHANGELOG.md | 5 +++++ .../aad/implementation/AadRestTemplateCreator.java | 13 +++---------- ...HttpSessionOAuth2AuthorizedClientRepository.java | 4 ++-- .../implementation/AadRestTemplateCreatorTest.java | 7 ++++--- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index e7537ffe003f..84d8bf1604dd 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -1,5 +1,10 @@ # Release History +## 4.5.0-beta.5 (Unreleased) + +### 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..a499019e18af 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 @@ -35,17 +35,10 @@ public static RestTemplate createOAuth2ErrorResponseHandledRestTemplate(RestTemp 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()); - } + converters.clear(); + converters.add(new FormHttpMessageConverter()); + converters.add(new OAuth2AccessTokenResponseHttpMessageConverter()); return restTemplate; } - private static boolean notContainsElementOfType(List list, Class clazz) { - return list.stream().noneMatch(item -> item.getClass().equals(clazz)); - } - } 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..5b5ec11c92ed 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 @@ -12,7 +12,7 @@ import javax.servlet.http.HttpServletRequest; 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; @@ -77,6 +77,6 @@ private Map getAuthorizedClients(HttpServletRequ .map(s -> s.getAttribute(AUTHORIZED_CLIENTS_ATTR_NAME)) .map(Object::toString) .map(SerializerUtils::deserializeOAuth2AuthorizedClientMap) - .orElse(Collections.emptyMap()); + .orElseGet(HashMap::new); } } 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)); }); From 8836ab237bff56835527f762d6076c0438cb8ac4 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 10:55:16 +0800 Subject: [PATCH 2/8] Fix version error in CHANGELOG.md. --- sdk/spring/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 84d8bf1604dd..7c5da4c2cfb8 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 4.5.0-beta.5 (Unreleased) +## 4.5.0-beta.2 (Unreleased) ### Bugs Fixed - Fix bug: The parameter 'scope' is duplicated. [31191](https://github.com/Azure/azure-sdk-for-java/issues/31191). From 88b1e0435456e670473cdb97bca6923f42fbdf73 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 10:58:19 +0800 Subject: [PATCH 3/8] Simplify AadRestTemplateCreator. --- .../implementation/AadRestTemplateCreator.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) 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 a499019e18af..b4d8242a2e72 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,18 +24,13 @@ public static RestTemplate createRestTemplate(RestTemplateBuilder builder) { } public static RestTemplate createOAuth2ErrorResponseHandledRestTemplate(RestTemplateBuilder builder) { - RestTemplate restTemplate = createRestTemplate(builder); - restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); - return restTemplate; + builder.errorHandler(new OAuth2ErrorResponseErrorHandler()); + return createRestTemplate(builder); } public static RestTemplate createOAuth2AccessTokenResponseClientRestTemplate(RestTemplateBuilder builder) { - RestTemplate restTemplate = createOAuth2ErrorResponseHandledRestTemplate(builder); - List> converters = restTemplate.getMessageConverters(); - converters.clear(); - converters.add(new FormHttpMessageConverter()); - converters.add(new OAuth2AccessTokenResponseHttpMessageConverter()); - return restTemplate; + builder.messageConverters(new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter()); + return createOAuth2ErrorResponseHandledRestTemplate(builder); } } From 5af9bed626098cec320be48f11a2680947e2cf9c Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 14:11:33 +0800 Subject: [PATCH 4/8] Update the logic of unmodifiableMap, make it more robust. --- .../aad/implementation/jackson/SerializerUtils.java | 4 ++-- ...JacksonHttpSessionOAuth2AuthorizedClientRepository.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) 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..93c9bee6222e 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,7 +10,7 @@ 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 { @@ -45,7 +45,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/JacksonHttpSessionOAuth2AuthorizedClientRepository.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/JacksonHttpSessionOAuth2AuthorizedClientRepository.java index 5b5ec11c92ed..2729f103d419 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 @@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletRequest; 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); + Map authorizedClients = new HashMap<>(this.getAuthorizedClients(request)); authorizedClients.put(authorizedClient.getClientRegistration().getRegistrationId(), authorizedClient); request.getSession().setAttribute(AUTHORIZED_CLIENTS_ATTR_NAME, - serializeOAuth2AuthorizedClientMap(authorizedClients)); + serializeOAuth2AuthorizedClientMap(Collections.unmodifiableMap(authorizedClients))); } @Override @@ -77,6 +78,6 @@ private Map getAuthorizedClients(HttpServletRequ .map(s -> s.getAttribute(AUTHORIZED_CLIENTS_ATTR_NAME)) .map(Object::toString) .map(SerializerUtils::deserializeOAuth2AuthorizedClientMap) - .orElseGet(HashMap::new); + .orElseGet(Collections::emptyMap); } } From a647731cf00fe14f7b486a8408b86c0a030804c1 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 14:41:30 +0800 Subject: [PATCH 5/8] Fix bug: "addHeadersConverter" and "addParametersConverter" should only be executed once. --- ...zationCodeGrantRequestEntityConverter.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) 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..865f1ff1ca79 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,11 +4,10 @@ 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.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.util.Collections; @@ -20,25 +19,17 @@ public abstract class AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter extends OAuth2AuthorizationCodeGrantRequestEntityConverter { + protected AbstractOAuth2AuthorizationCodeGrantRequestEntityConverter() { + addHeadersConverter((request) -> getHttpHeaders()); + addParametersConverter(this::getHttpBody); + } + /** * Gets the application ID. * * @return the application ID */ 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 @@ -57,6 +48,6 @@ public HttpHeaders getHttpHeaders() { * @return MultiValueMap */ public MultiValueMap getHttpBody(OAuth2AuthorizationCodeGrantRequest request) { - return null; + return new LinkedMultiValueMap<>(); } } From d76c78a1c9fdc44dece9cfb51bef8f6196ea932a Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 14:58:07 +0800 Subject: [PATCH 6/8] Fix error by adding "builder = builder.xxx" --- .../aad/implementation/AadRestTemplateCreator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 b4d8242a2e72..314f9742f8e7 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 @@ -24,12 +24,13 @@ public static RestTemplate createRestTemplate(RestTemplateBuilder builder) { } public static RestTemplate createOAuth2ErrorResponseHandledRestTemplate(RestTemplateBuilder builder) { - builder.errorHandler(new OAuth2ErrorResponseErrorHandler()); + builder = builder.errorHandler(new OAuth2ErrorResponseErrorHandler()); return createRestTemplate(builder); } public static RestTemplate createOAuth2AccessTokenResponseClientRestTemplate(RestTemplateBuilder builder) { - builder.messageConverters(new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter()); + builder = builder.messageConverters( + new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter()); return createOAuth2ErrorResponseHandledRestTemplate(builder); } From 9f7fbf9324780fa2724cc5f6b86e902cb936dda4 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 16:49:41 +0800 Subject: [PATCH 7/8] Fix #31218. Set restOperations even if jwkResolver is null. --- .../AadOAuth2ClientConfiguration.java | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java index a6d8369d2253..ff9a3ba4c0f0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java @@ -142,13 +142,13 @@ JwtBearerOAuth2AuthorizedClientProvider azureAdJwtBearerProvider( ObjectProvider resolvers) { JwtBearerOAuth2AuthorizedClientProvider provider = new JwtBearerOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); - AadJwtBearerGrantRequestEntityConverter jwtBearerConverter = new AadJwtBearerGrantRequestEntityConverter(); - if (resolver != null) { - jwtBearerConverter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - } DefaultJwtBearerTokenResponseClient responseClient = new DefaultJwtBearerTokenResponseClient(); responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); - responseClient.setRequestEntityConverter(jwtBearerConverter); + if (resolver != null) { + AadJwtBearerGrantRequestEntityConverter converter = new AadJwtBearerGrantRequestEntityConverter(); + converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); + responseClient.setRequestEntityConverter(converter); + } provider.setAccessTokenResponseClient(responseClient); return provider; } @@ -159,47 +159,42 @@ RefreshTokenOAuth2AuthorizedClientProvider azureRefreshTokenProvider( ObjectProvider resolvers) { RefreshTokenOAuth2AuthorizedClientProvider provider = new RefreshTokenOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); + DefaultRefreshTokenTokenResponseClient responseClient = new DefaultRefreshTokenTokenResponseClient(); + responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2RefreshTokenGrantRequestEntityConverter converter = new OAuth2RefreshTokenGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultRefreshTokenTokenResponseClient responseClient = new DefaultRefreshTokenTokenResponseClient(); - responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); responseClient.setRequestEntityConverter(converter); - provider.setAccessTokenResponseClient(responseClient); } + provider.setAccessTokenResponseClient(responseClient); return provider; } private void passwordGrantBuilderAccessTokenResponseClientCustomizer( OAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilder builder, OAuth2ClientAuthenticationJwkResolver resolver) { + DefaultPasswordTokenResponseClient responseClient = new DefaultPasswordTokenResponseClient(); + responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2PasswordGrantRequestEntityConverter converter = new OAuth2PasswordGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultPasswordTokenResponseClient client = new DefaultPasswordTokenResponseClient(); - client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); - client.setRequestEntityConverter(converter); - - builder.accessTokenResponseClient(client); + responseClient.setRequestEntityConverter(converter); } + builder.accessTokenResponseClient(responseClient); } private void clientCredentialsGrantBuilderAccessTokenResponseClientCustomizer( OAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilder builder, OAuth2ClientAuthenticationJwkResolver resolver) { + DefaultClientCredentialsTokenResponseClient responseClient = new DefaultClientCredentialsTokenResponseClient(); + responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2ClientCredentialsGrantRequestEntityConverter converter = new OAuth2ClientCredentialsGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultClientCredentialsTokenResponseClient client = new DefaultClientCredentialsTokenResponseClient(); - client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); - client.setRequestEntityConverter(converter); - - builder.accessTokenResponseClient(client); + responseClient.setRequestEntityConverter(converter); } + builder.accessTokenResponseClient(responseClient); } private AadAzureDelegatedOAuth2AuthorizedClientProvider azureDelegatedOAuth2AuthorizedClientProvider( From 0f5851f190050b643f8d0476c41257c22fa7918b Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Sat, 8 Oct 2022 18:01:27 +0800 Subject: [PATCH 8/8] Fix error: AadJwtBearerGrantRequestEntityConverter should be used even if jwkResolver is null. --- .../aad/configuration/AadOAuth2ClientConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java index ff9a3ba4c0f0..3b0a7f652478 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java @@ -144,11 +144,11 @@ JwtBearerOAuth2AuthorizedClientProvider azureAdJwtBearerProvider( OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); DefaultJwtBearerTokenResponseClient responseClient = new DefaultJwtBearerTokenResponseClient(); responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); + AadJwtBearerGrantRequestEntityConverter converter = new AadJwtBearerGrantRequestEntityConverter(); if (resolver != null) { - AadJwtBearerGrantRequestEntityConverter converter = new AadJwtBearerGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - responseClient.setRequestEntityConverter(converter); } + responseClient.setRequestEntityConverter(converter); provider.setAccessTokenResponseClient(responseClient); return provider; }