From 1e6c34f4a3ab8c7a5e8df0b1236202b9b90691c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 02:50:39 +0000 Subject: [PATCH 1/3] Initial plan From e90990ad102c4cd9e93b6d2fa26230c97a213359 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 03:02:05 +0000 Subject: [PATCH 2/3] Fix OAuth2 JWT Bearer grant request parameter duplication in on-behalf-of flow Co-authored-by: Netyyyy <92105726+Netyyyy@users.noreply.github.com> --- .../spring-cloud-azure-autoconfigure/CHANGELOG.md | 2 ++ .../AadJwtBearerGrantRequestParametersConverter.java | 11 ++++++----- .../AadJwtBearerGrantRequestEntityConverterTests.java | 6 ++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md b/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md index 24ab5d428261..aa281c5af28a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md @@ -8,6 +8,8 @@ ### Bugs Fixed +- Fixed OAuth2 JWT Bearer grant request parameter duplication issue where `grant_type` was being duplicated when using the on-behalf-of flow, causing `AADSTS70003: unsupported_grant_type` error. [#47657](https://github.com/Azure/azure-sdk-for-java/issues/47657) + ### Other Changes ## 7.0.0-beta.1 (2025-12-23) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestParametersConverter.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestParametersConverter.java index 234e2c8f2a02..fc201915ddc4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestParametersConverter.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestParametersConverter.java @@ -4,12 +4,16 @@ package com.azure.spring.cloud.autoconfigure.implementation.aad.security; import org.springframework.core.convert.converter.Converter; -import org.springframework.security.oauth2.client.endpoint.DefaultOAuth2TokenRequestParametersConverter; import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; /** * This is a special JWT Bearer flow implementation for Microsoft identify platform. + * This converter only adds the Azure-specific parameter "requested_token_use" with value "on_behalf_of". + * The standard OAuth2 parameters (grant_type, assertion, client_id, etc.) are added by Spring Security's + * DefaultOAuth2TokenRequestParametersConverter, which is automatically included when using + * RestClientJwtBearerTokenResponseClient. * * @since 7.0.0 * @see OAuth 2.0 On-Behalf-Of @@ -17,12 +21,9 @@ public class AadJwtBearerGrantRequestParametersConverter implements Converter> { - private final DefaultOAuth2TokenRequestParametersConverter delegate = - new DefaultOAuth2TokenRequestParametersConverter<>(); - @Override public MultiValueMap convert(JwtBearerGrantRequest jwtBearerGrantRequest) { - MultiValueMap parameters = delegate.convert(jwtBearerGrantRequest); + MultiValueMap parameters = new LinkedMultiValueMap<>(); parameters.add("requested_token_use", "on_behalf_of"); return parameters; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestEntityConverterTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestEntityConverterTests.java index bdeb4fe16707..53d5ed97b57f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestEntityConverterTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/aad/security/AadJwtBearerGrantRequestEntityConverterTests.java @@ -40,5 +40,11 @@ void requestedTokenUseParameter() { Assertions.assertNotNull(parameters); assertTrue(parameters.containsKey("requested_token_use")); assertEquals("on_behalf_of", parameters.getFirst("requested_token_use")); + // Verify that the converter does not add grant_type or other standard OAuth2 parameters + // to avoid duplication when composed with DefaultOAuth2TokenRequestParametersConverter + Assertions.assertFalse(parameters.containsKey("grant_type"), + "Converter should not add grant_type to avoid duplication"); + assertEquals(1, parameters.size(), + "Converter should only add the Azure-specific parameter"); } } From 51f9465c3ef104afd456c2b53cf291fc814ccac6 Mon Sep 17 00:00:00 2001 From: muyao Date: Tue, 13 Jan 2026 10:04:09 +0800 Subject: [PATCH 3/3] Fix cspell --- .vscode/cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index bd85726cce1c..1ce3f3ab3379 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -1245,6 +1245,7 @@ "words": [ "aadb", "AADB", + "AADSTS", "amqps", "Authoritys", "autoconfiguation",