From 7c292d2badabb310923810f289d33b2554037102 Mon Sep 17 00:00:00 2001 From: Walter Medvedeo Date: Wed, 11 Jun 2025 09:41:05 +0200 Subject: [PATCH 1/3] issue-1182: Token propagation throws java.lang.UnsupportedOperationException when adding the token to the request header parameters --- .../it/security/TokenPropagationResource.java | 26 +++++----- .../TokenPropagationExternalServicesMock.java | 7 +-- .../it/security/TokenPropagationTest.java | 48 ++++++++++++++----- .../OAuth2AuthenticationProvider.java | 10 ++-- .../providers/AbstractAuthProvider.java | 6 ++- .../BasicAuthenticationProvider.java | 8 ++-- .../BearerAuthenticationProvider.java | 7 ++- 7 files changed, 73 insertions(+), 39 deletions(-) diff --git a/client/integration-tests/security/src/main/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationResource.java b/client/integration-tests/security/src/main/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationResource.java index cabb361ee..4253357f3 100644 --- a/client/integration-tests/security/src/main/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationResource.java +++ b/client/integration-tests/security/src/main/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationResource.java @@ -2,6 +2,7 @@ import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.rest.client.inject.RestClient; @@ -25,36 +26,31 @@ public class TokenPropagationResource { @POST @Path("service1") - public String service1() { - defaultApi1.executeQuery1(); - return "hello"; + public Response service1() { + return defaultApi1.executeQuery1(); } @POST @Path("service2") - public String service2() { - defaultApi2.executeQuery2(); - return "hello"; + public Response service2() { + return defaultApi2.executeQuery2(); } @POST @Path("service3") - public String service3() { - defaultApi3.executeQuery3(); - return "hello"; + public Response service3() { + return defaultApi3.executeQuery3(); } @POST @Path("service4") - public String service4() { - defaultApi4.executeQuery4(); - return "hello"; + public Response service4() { + return defaultApi4.executeQuery4(); } @POST @Path("service5") - public String service5() { - defaultApi5.executeQuery5(); - return "hello"; + public Response service5() { + return defaultApi5.executeQuery5(); } } diff --git a/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationExternalServicesMock.java b/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationExternalServicesMock.java index 43b6289e3..53ecbf2ac 100644 --- a/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationExternalServicesMock.java +++ b/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationExternalServicesMock.java @@ -23,7 +23,8 @@ public class TokenPropagationExternalServicesMock implements QuarkusTestResourceLifecycleManager { - public static final String AUTHORIZATION_TOKEN = "AUTHORIZATION_TOKEN"; + public static final String SERVICE1_AUTHORIZATION_TOKEN = "SERVICE1_AUTHORIZATION_TOKEN"; + public static final String SERVICE2_AUTHORIZATION_TOKEN = "SERVICE2_AUTHORIZATION_TOKEN"; public static final String SERVICE3_HEADER_TO_PROPAGATE = "SERVICE3_HEADER_TO_PROPAGATE"; public static final String SERVICE3_AUTHORIZATION_TOKEN = "SERVICE3_AUTHORIZATION_TOKEN"; public static final String SERVICE4_HEADER_TO_PROPAGATE = "SERVICE4_HEADER_TO_PROPAGATE"; @@ -49,10 +50,10 @@ public Map start() { LOGGER.info("Mocked Server started at {}", wireMockServer.baseUrl()); // stub the token-propagation-external-service1 invocation with the expected token - stubForExternalService("/token-propagation-external-service1/executeQuery1", AUTHORIZATION_TOKEN); + stubForExternalService("/token-propagation-external-service1/executeQuery1", SERVICE1_AUTHORIZATION_TOKEN); // stub the token-propagation-external-service2 invocation with the expected token - stubForExternalService("/token-propagation-external-service2/executeQuery2", AUTHORIZATION_TOKEN); + stubForExternalService("/token-propagation-external-service2/executeQuery2", SERVICE2_AUTHORIZATION_TOKEN); // stub the token-propagation-external-service3 invocation with the expected token stubForExternalService("/token-propagation-external-service3/executeQuery3", SERVICE3_AUTHORIZATION_TOKEN); diff --git a/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationTest.java b/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationTest.java index 544e360d3..a131c53e5 100644 --- a/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationTest.java +++ b/client/integration-tests/security/src/test/java/io/quarkiverse/openapi/generator/it/security/TokenPropagationTest.java @@ -1,20 +1,25 @@ package io.quarkiverse.openapi.generator.it.security; -import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.AUTHORIZATION_TOKEN; +import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE1_AUTHORIZATION_TOKEN; +import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE2_AUTHORIZATION_TOKEN; import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE3_AUTHORIZATION_TOKEN; import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE3_HEADER_TO_PROPAGATE; import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE4_AUTHORIZATION_TOKEN; import static io.quarkiverse.openapi.generator.it.security.TokenPropagationExternalServicesMock.SERVICE4_HEADER_TO_PROPAGATE; import static io.restassured.RestAssured.given; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Stream; import jakarta.ws.rs.core.HttpHeaders; import org.junit.jupiter.api.Tag; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; @@ -26,21 +31,40 @@ @Tag("resteasy-classic") class TokenPropagationTest { - @ParameterizedTest - @ValueSource(strings = { "service1", "service2", "service3", "service4", "service5" }) - void service1(String service) { - Map headers = new HashMap<>(); - // service token-propagation-external-service1 and token-propagation-external-service2 will receive the AUTHORIZATION_TOKEN - headers.put(HttpHeaders.AUTHORIZATION, AUTHORIZATION_TOKEN); - // service token-propagation-external-service3 will receive the SERVICE3_AUTHORIZATION_TOKEN - headers.put(SERVICE3_HEADER_TO_PROPAGATE, SERVICE3_AUTHORIZATION_TOKEN); - // service token-propagation-external-service4 will receive the SERVICE4_AUTHORIZATION_TOKEN - headers.put(SERVICE4_HEADER_TO_PROPAGATE, SERVICE4_AUTHORIZATION_TOKEN); + private static class HeaderArgument { + String headerName; + String headerValue; + + HeaderArgument(String headerName, String headerValue) { + this.headerName = headerName; + this.headerValue = headerValue; + } + + } + @ParameterizedTest + @MethodSource("serviceInvocationParams") + void invokeService(String service, HeaderArgument headerArgument) { + Map> headers = new HashMap<>(); + headers.put(headerArgument.headerName, Collections.singletonList(headerArgument.headerValue)); given() .headers(headers) .post("/token_propagation/" + service) .then() .statusCode(200); } + + private static Stream serviceInvocationParams() { + return Stream.of( + // service token-propagation-external-service1 will receive the SERVICE1_AUTHORIZATION_TOKEN + Arguments.of("service1", new HeaderArgument(HttpHeaders.AUTHORIZATION, SERVICE1_AUTHORIZATION_TOKEN)), + // service token-propagation-external-service2 will receive the SERVICE2_AUTHORIZATION_TOKEN + Arguments.of("service2", new HeaderArgument(HttpHeaders.AUTHORIZATION, SERVICE2_AUTHORIZATION_TOKEN)), + // service token-propagation-external-service3 will receive the SERVICE3_AUTHORIZATION_TOKEN + Arguments.of("service3", new HeaderArgument(SERVICE3_HEADER_TO_PROPAGATE, SERVICE3_AUTHORIZATION_TOKEN)), + // service token-propagation-external-service4 will receive the SERVICE4_AUTHORIZATION_TOKEN + Arguments.of("service4", new HeaderArgument(SERVICE4_HEADER_TO_PROPAGATE, SERVICE4_AUTHORIZATION_TOKEN)) + + ); + } } diff --git a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java index f4f7009ed..cc45d8348 100644 --- a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java +++ b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java @@ -3,6 +3,7 @@ import static io.quarkiverse.openapi.generator.AuthConfig.TOKEN_PROPAGATION; import java.io.IOException; +import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; @@ -32,9 +33,12 @@ public OAuth2AuthenticationProvider(String name, @Override public void filter(ClientRequestContext requestContext) throws IOException { if (isTokenPropagation()) { - String bearerToken = getTokenForPropagation(requestContext.getHeaders()); - bearerToken = sanitizeBearerToken(bearerToken); - requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, OidcConstants.BEARER_SCHEME + " " + bearerToken); + String bearerToken = sanitizeBearerToken(getTokenForPropagation(requestContext.getHeaders())); + if (!isEmptyOrBlank(bearerToken)) { + requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); + requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, + Collections.singletonList(OidcConstants.BEARER_SCHEME + " " + bearerToken)); + } } else { delegate.filter(requestContext); } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java index d5a776fc1..b7ae07a2c 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java @@ -68,7 +68,7 @@ public boolean isTokenPropagation() { public String getTokenForPropagation(MultivaluedMap httpHeaders) { String headerName = getHeaderName() != null ? getHeaderName() : HttpHeaders.AUTHORIZATION; String propagatedHeaderName = propagationHeaderName(getOpenApiSpecId(), getName(), headerName); - return Objects.toString(httpHeaders.getFirst(propagatedHeaderName)); + return Objects.toString(httpHeaders.getFirst(propagatedHeaderName), null); } public String getHeaderName() { @@ -88,4 +88,8 @@ public final String getCanonicalAuthConfigPropertyName(String authPropertyName) public static String getCanonicalAuthConfigPropertyName(String authPropertyName, String openApiSpecId, String authName) { return String.format(CANONICAL_AUTH_CONFIG_PROPERTY_NAME, openApiSpecId, authName, authPropertyName); } + + protected static boolean isEmptyOrBlank(String value) { + return value == null || value.isBlank(); + } } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java index 10011a9b3..299becbb3 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java @@ -1,6 +1,7 @@ package io.quarkiverse.openapi.generator.providers; import java.io.IOException; +import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; @@ -44,9 +45,10 @@ public void filter(ClientRequestContext requestContext) throws IOException { basicToken = sanitizeBasicToken(getTokenForPropagation(requestContext.getHeaders())); } - if (!basicToken.isBlank()) { - requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, - AuthUtils.basicAuthAccessToken(basicToken)); + if (!isEmptyOrBlank(basicToken)) { + requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); + requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, + Collections.singletonList(AuthUtils.basicAuthAccessToken(basicToken))); } } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java index 5454b1808..b86af74df 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java @@ -1,6 +1,7 @@ package io.quarkiverse.openapi.generator.providers; import java.io.IOException; +import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; @@ -34,8 +35,10 @@ public void filter(ClientRequestContext requestContext) throws IOException { bearerToken = sanitizeBearerToken(getTokenForPropagation(requestContext.getHeaders())); } - if (!bearerToken.isBlank()) { - requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, AuthUtils.authTokenOrBearer(this.scheme, bearerToken)); + if (!isEmptyOrBlank(bearerToken)) { + requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); + requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, + Collections.singletonList(AuthUtils.authTokenOrBearer(this.scheme, bearerToken))); } } From aacfbd86dc03b39da42de94063b164c65ebadc23 Mon Sep 17 00:00:00 2001 From: Walter Medvedeo Date: Wed, 11 Jun 2025 15:45:23 +0200 Subject: [PATCH 2/3] Review comments 1 --- .../oidc/providers/OAuth2AuthenticationProvider.java | 6 +----- .../openapi/generator/providers/AbstractAuthProvider.java | 5 +++++ .../generator/providers/BasicAuthenticationProvider.java | 7 +------ .../generator/providers/BearerAuthenticationProvider.java | 6 +----- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java index cc45d8348..e638ee232 100644 --- a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java +++ b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java @@ -3,11 +3,9 @@ import static io.quarkiverse.openapi.generator.AuthConfig.TOKEN_PROPAGATION; import java.io.IOException; -import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.core.HttpHeaders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,9 +33,7 @@ public void filter(ClientRequestContext requestContext) throws IOException { if (isTokenPropagation()) { String bearerToken = sanitizeBearerToken(getTokenForPropagation(requestContext.getHeaders())); if (!isEmptyOrBlank(bearerToken)) { - requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); - requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, - Collections.singletonList(OidcConstants.BEARER_SCHEME + " " + bearerToken)); + addAuthorizationHeader(requestContext.getHeaders(), OidcConstants.BEARER_SCHEME + " " + bearerToken); } } else { delegate.filter(requestContext); diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java index b7ae07a2c..ce4f9fcc1 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java @@ -4,6 +4,7 @@ import static io.quarkiverse.openapi.generator.providers.AbstractAuthenticationPropagationHeadersFactory.propagationHeaderName; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -89,6 +90,10 @@ public static String getCanonicalAuthConfigPropertyName(String authPropertyName, return String.format(CANONICAL_AUTH_CONFIG_PROPERTY_NAME, openApiSpecId, authName, authPropertyName); } + protected void addAuthorizationHeader(MultivaluedMap headers, String value) { + headers.put(HttpHeaders.AUTHORIZATION, Collections.singletonList(value)); + } + protected static boolean isEmptyOrBlank(String value) { return value == null || value.isBlank(); } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java index 299becbb3..ee8f458a3 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java @@ -1,11 +1,9 @@ package io.quarkiverse.openapi.generator.providers; import java.io.IOException; -import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.core.HttpHeaders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,10 +44,7 @@ public void filter(ClientRequestContext requestContext) throws IOException { } if (!isEmptyOrBlank(basicToken)) { - requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); - requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, - Collections.singletonList(AuthUtils.basicAuthAccessToken(basicToken))); + addAuthorizationHeader(requestContext.getHeaders(), AuthUtils.basicAuthAccessToken(basicToken)); } - } } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java index b86af74df..3d43e9ce3 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java @@ -1,11 +1,9 @@ package io.quarkiverse.openapi.generator.providers; import java.io.IOException; -import java.util.Collections; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.core.HttpHeaders; /** * Provides bearer token authentication or any other valid scheme. @@ -36,9 +34,7 @@ public void filter(ClientRequestContext requestContext) throws IOException { } if (!isEmptyOrBlank(bearerToken)) { - requestContext.getHeaders().remove(HttpHeaders.AUTHORIZATION); - requestContext.getHeaders().put(HttpHeaders.AUTHORIZATION, - Collections.singletonList(AuthUtils.authTokenOrBearer(this.scheme, bearerToken))); + addAuthorizationHeader(requestContext.getHeaders(), AuthUtils.authTokenOrBearer(this.scheme, bearerToken)); } } From 611ebf1f9a895154e28c701c66915782d174cc00 Mon Sep 17 00:00:00 2001 From: Walter Medvedeo Date: Wed, 11 Jun 2025 23:25:56 +0200 Subject: [PATCH 3/3] Review comments 2 --- .../oidc/providers/OAuth2AuthenticationProvider.java | 3 +++ .../generator/providers/AbstractAuthProvider.java | 7 +++++-- .../providers/BasicAuthenticationProvider.java | 9 +++++++++ .../providers/BearerAuthenticationProvider.java | 12 ++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java index e638ee232..7b8e3b0c4 100644 --- a/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java +++ b/client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java @@ -34,6 +34,9 @@ public void filter(ClientRequestContext requestContext) throws IOException { String bearerToken = sanitizeBearerToken(getTokenForPropagation(requestContext.getHeaders())); if (!isEmptyOrBlank(bearerToken)) { addAuthorizationHeader(requestContext.getHeaders(), OidcConstants.BEARER_SCHEME + " " + bearerToken); + } else { + LOGGER.debug("No oauth2 bearer token was found to propagate for the security scheme: {}." + + " You must verify that the request header: {} is set.", getName(), getHeaderForPropagation()); } } else { delegate.filter(requestContext); diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java index ce4f9fcc1..ff738a16e 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java @@ -67,11 +67,14 @@ public boolean isTokenPropagation() { } public String getTokenForPropagation(MultivaluedMap httpHeaders) { - String headerName = getHeaderName() != null ? getHeaderName() : HttpHeaders.AUTHORIZATION; - String propagatedHeaderName = propagationHeaderName(getOpenApiSpecId(), getName(), headerName); + String propagatedHeaderName = propagationHeaderName(getOpenApiSpecId(), getName(), getHeaderForPropagation()); return Objects.toString(httpHeaders.getFirst(propagatedHeaderName), null); } + public String getHeaderForPropagation() { + return getHeaderName() != null ? getHeaderName() : HttpHeaders.AUTHORIZATION; + } + public String getHeaderName() { return ConfigProvider.getConfig() .getOptionalValue(getCanonicalAuthConfigPropertyName(AuthConfig.HEADER_NAME), String.class).orElse(null); diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java index ee8f458a3..343b2e18d 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java @@ -1,5 +1,8 @@ package io.quarkiverse.openapi.generator.providers; +import static io.quarkiverse.openapi.generator.providers.ConfigCredentialsProvider.PASSWORD; +import static io.quarkiverse.openapi.generator.providers.ConfigCredentialsProvider.USER_NAME; + import java.io.IOException; import java.util.List; @@ -45,6 +48,12 @@ public void filter(ClientRequestContext requestContext) throws IOException { if (!isEmptyOrBlank(basicToken)) { addAuthorizationHeader(requestContext.getHeaders(), AuthUtils.basicAuthAccessToken(basicToken)); + } else { + LOGGER.debug("No basic authentication token was found for the security scheme: {}." + + " You must verify that the properties: {} and {} are properly configured, or the request header: {} is set when the token propagation is enabled.", + getName(), getCanonicalAuthConfigPropertyName(USER_NAME, getOpenApiSpecId(), getName()), + getCanonicalAuthConfigPropertyName(PASSWORD, getOpenApiSpecId(), getName()), + getHeaderForPropagation()); } } } diff --git a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java index 3d43e9ce3..d5dae2a74 100644 --- a/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java +++ b/client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java @@ -1,10 +1,15 @@ package io.quarkiverse.openapi.generator.providers; +import static io.quarkiverse.openapi.generator.providers.ConfigCredentialsProvider.BEARER_TOKEN; + import java.io.IOException; import java.util.List; import jakarta.ws.rs.client.ClientRequestContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Provides bearer token authentication or any other valid scheme. * @@ -12,6 +17,8 @@ */ public class BearerAuthenticationProvider extends AbstractAuthProvider { + private static final Logger LOGGER = LoggerFactory.getLogger(BearerAuthenticationProvider.class); + private final String scheme; public BearerAuthenticationProvider(final String openApiSpecId, final String name, final String scheme, @@ -35,6 +42,11 @@ public void filter(ClientRequestContext requestContext) throws IOException { if (!isEmptyOrBlank(bearerToken)) { addAuthorizationHeader(requestContext.getHeaders(), AuthUtils.authTokenOrBearer(this.scheme, bearerToken)); + } else { + LOGGER.debug("No bearer token was found for the security scheme: {}." + + " You must verify that the property: {} is properly configured, or the request header: {} is set when the token propagation is enabled.", + getName(), getCanonicalAuthConfigPropertyName(BEARER_TOKEN, getOpenApiSpecId(), getName()), + getHeaderForPropagation()); } }