Skip to content

Commit a85488a

Browse files
Fix #940 - Change authorization properties configuration to RUNTIME (#943) (#952)
* Fix #940 - Change authorization properties configuration to RUNTIME * Add generated configuration properties * Fix runtime unit tests * Incorporating @mcruzdev's review * incorporating @hbelmiro's review --------- Signed-off-by: Ricardo Zanini <[email protected]> Co-authored-by: Ricardo Zanini <[email protected]>
1 parent 6863eb5 commit a85488a

22 files changed

+2193
-218
lines changed

client/integration-tests/security/src/main/java/io/quarkiverse/openapi/generator/it/security/auth/DummyApiKeyAuthenticationProvider.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,22 @@
55

66
import jakarta.annotation.PostConstruct;
77
import jakarta.annotation.Priority;
8-
import jakarta.inject.Inject;
98
import jakarta.ws.rs.Priorities;
109
import jakarta.ws.rs.client.ClientRequestContext;
1110
import jakarta.ws.rs.client.ClientRequestFilter;
1211

13-
import io.quarkiverse.openapi.generator.OpenApiGeneratorConfig;
14-
import io.quarkiverse.openapi.generator.SpecItemConfig;
1512
import io.quarkiverse.openapi.generator.providers.ApiKeyAuthenticationProvider;
1613
import io.quarkiverse.openapi.generator.providers.ApiKeyIn;
1714
import io.quarkiverse.openapi.generator.providers.AuthProvider;
1815

1916
@Priority(Priorities.AUTHENTICATION)
2017
public class DummyApiKeyAuthenticationProvider implements ClientRequestFilter {
2118

22-
@Inject
23-
OpenApiGeneratorConfig generatorConfig;
24-
2519
private AuthProvider authProvider;
2620

2721
@PostConstruct
2822
public void init() {
2923
authProvider = new ApiKeyAuthenticationProvider("open_weather_custom_security_yaml", "app_id", ApiKeyIn.query, "appid",
30-
generatorConfig.getItemConfig("open_weather_custom_security_yaml")
31-
.flatMap(SpecItemConfig::getAuth).flatMap(x -> x.getItemConfig("app_id")).orElse(null),
3224
List.of());
3325
}
3426

client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/OidcAuthenticationRecorder.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import java.util.List;
44
import java.util.function.Function;
55

6-
import io.quarkiverse.openapi.generator.AuthenticationRecorder;
76
import io.quarkiverse.openapi.generator.OidcClient;
8-
import io.quarkiverse.openapi.generator.OpenApiGeneratorConfig;
97
import io.quarkiverse.openapi.generator.oidc.providers.OAuth2AuthenticationProvider;
108
import io.quarkiverse.openapi.generator.providers.AuthProvider;
119
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
@@ -14,18 +12,12 @@
1412

1513
@Recorder
1614
public class OidcAuthenticationRecorder {
17-
private final OpenApiGeneratorConfig generatorConfig;
18-
19-
public OidcAuthenticationRecorder(OpenApiGeneratorConfig generatorConfig) {
20-
this.generatorConfig = generatorConfig;
21-
}
2215

2316
public Function<SyntheticCreationalContext<AuthProvider>, AuthProvider> recordOauthAuthProvider(
2417
String name,
2518
String openApiSpecId,
2619
List<OperationAuthInfo> operations) {
27-
return context -> new OAuth2AuthenticationProvider(
28-
AuthenticationRecorder.getAuthConfig(generatorConfig, openApiSpecId, name), name, openApiSpecId,
20+
return context -> new OAuth2AuthenticationProvider(name, openApiSpecId,
2921
context.getInjectedReference(OAuth2AuthenticationProvider.OidcClientRequestFilterDelegate.class,
3022
new OidcClient.Literal(name)),
3123
operations);

client/oidc/src/main/java/io/quarkiverse/openapi/generator/oidc/providers/OAuth2AuthenticationProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
1313

14-
import io.quarkiverse.openapi.generator.AuthConfig;
1514
import io.quarkiverse.openapi.generator.providers.AbstractAuthProvider;
1615
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
1716
import io.quarkus.oidc.common.runtime.OidcConstants;
@@ -22,9 +21,9 @@ public class OAuth2AuthenticationProvider extends AbstractAuthProvider {
2221

2322
private final OidcClientRequestFilterDelegate delegate;
2423

25-
public OAuth2AuthenticationProvider(final AuthConfig authConfig, String name,
24+
public OAuth2AuthenticationProvider(String name,
2625
String openApiSpecId, OidcClientRequestFilterDelegate delegate, List<OperationAuthInfo> operations) {
27-
super(authConfig, name, openApiSpecId, operations);
26+
super(name, openApiSpecId, operations);
2827
this.delegate = delegate;
2928
validateConfig();
3029
}

client/runtime/src/main/java/io/quarkiverse/openapi/generator/AuthConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
public class AuthConfig {
1818

1919
public static final String TOKEN_PROPAGATION = "token-propagation";
20+
public static final String HEADER_NAME = "header-name";
2021

2122
/**
2223
* Enables the authentication token propagation for this particular securityScheme.
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.quarkiverse.openapi.generator;
22

33
import java.util.List;
4-
import java.util.Objects;
54
import java.util.function.Function;
65

76
import jakarta.enterprise.inject.Instance;
@@ -21,12 +20,6 @@
2120
@Recorder
2221
public class AuthenticationRecorder {
2322

24-
final OpenApiGeneratorConfig generatorConfig;
25-
26-
public AuthenticationRecorder(OpenApiGeneratorConfig generatorConfig) {
27-
this.generatorConfig = generatorConfig;
28-
}
29-
3023
public Function<SyntheticCreationalContext<CompositeAuthenticationProvider>, CompositeAuthenticationProvider> recordCompositeProvider(
3124
String openApiSpec) {
3225
return ctx -> {
@@ -42,34 +35,22 @@ public Function<SyntheticCreationalContext<AuthProvider>, AuthProvider> recordAp
4235
ApiKeyIn apiKeyIn,
4336
String apiKeyName,
4437
List<OperationAuthInfo> operations) {
45-
return context -> new ApiKeyAuthenticationProvider(openApiSpecId, name, apiKeyIn, apiKeyName,
46-
getAuthConfig(generatorConfig, openApiSpecId, name),
47-
operations);
38+
return context -> new ApiKeyAuthenticationProvider(openApiSpecId, name, apiKeyIn, apiKeyName, operations);
4839
}
4940

5041
public Function<SyntheticCreationalContext<AuthProvider>, AuthProvider> recordBearerAuthProvider(
5142
String name,
5243
String scheme,
5344
String openApiSpecId,
5445
List<OperationAuthInfo> operations) {
55-
return context -> new BearerAuthenticationProvider(openApiSpecId, name, scheme,
56-
getAuthConfig(generatorConfig, openApiSpecId, name),
57-
operations);
46+
return context -> new BearerAuthenticationProvider(openApiSpecId, name, scheme, operations);
5847
}
5948

6049
public Function<SyntheticCreationalContext<AuthProvider>, AuthProvider> recordBasicAuthProvider(
6150
String name,
6251
String openApiSpecId,
6352
List<OperationAuthInfo> operations) {
64-
return context -> new BasicAuthenticationProvider(openApiSpecId, name,
65-
getAuthConfig(generatorConfig, openApiSpecId, name), operations);
53+
return context -> new BasicAuthenticationProvider(openApiSpecId, name, operations);
6654
}
6755

68-
public static AuthConfig getAuthConfig(OpenApiGeneratorConfig generatorConfig, String openApiSpecId, String name) {
69-
return Objects.requireNonNull(generatorConfig, "generatorConfig can't be null.")
70-
.getItemConfig(openApiSpecId)
71-
.flatMap(SpecItemConfig::getAuth)
72-
.flatMap(authsConfig -> authsConfig.getItemConfig(name))
73-
.orElse(null);
74-
}
7556
}

client/runtime/src/main/java/io/quarkiverse/openapi/generator/OpenApiGeneratorConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
/**
1212
* This class represents the runtime configurations for the openapi-generator extension.
1313
*/
14-
@ConfigRoot(name = OpenApiGeneratorConfig.RUNTIME_TIME_CONFIG_PREFIX, phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
14+
@ConfigRoot(name = OpenApiGeneratorConfig.RUNTIME_TIME_CONFIG_PREFIX, phase = ConfigPhase.RUN_TIME)
1515
public class OpenApiGeneratorConfig {
1616

1717
public static final String RUNTIME_TIME_CONFIG_PREFIX = "openapi-generator";

client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthProvider.java

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,33 @@
1010
import jakarta.ws.rs.core.HttpHeaders;
1111
import jakarta.ws.rs.core.MultivaluedMap;
1212

13+
import org.eclipse.microprofile.config.ConfigProvider;
14+
1315
import io.quarkiverse.openapi.generator.AuthConfig;
1416

1517
public abstract class AbstractAuthProvider implements AuthProvider {
1618

1719
private static final String BEARER_WITH_SPACE = "Bearer ";
18-
private static final String CANONICAL_AUTH_CONFIG_PROPERTY_NAME = "quarkus." +
19-
RUNTIME_TIME_CONFIG_PREFIX + ".%s.auth.%s.%s";
20+
private static final String CANONICAL_AUTH_CONFIG_PROPERTY_NAME = "quarkus." + RUNTIME_TIME_CONFIG_PREFIX
21+
+ ".%s.auth.%s.%s";
2022

2123
private final String openApiSpecId;
2224
private final String name;
23-
private final AuthConfig authConfig;
2425
private final List<OperationAuthInfo> applyToOperations = new ArrayList<>();
2526

26-
protected AbstractAuthProvider(AuthConfig authConfig, String name, String openApiSpecId,
27-
List<OperationAuthInfo> operations) {
27+
protected AbstractAuthProvider(String name, String openApiSpecId, List<OperationAuthInfo> operations) {
2828
this.name = name;
2929
this.openApiSpecId = openApiSpecId;
30-
this.authConfig = authConfig;
3130
this.applyToOperations.addAll(operations);
3231
}
3332

33+
protected static String sanitizeBearerToken(String token) {
34+
if (token != null && token.toLowerCase().startsWith(BEARER_WITH_SPACE.toLowerCase())) {
35+
return token.substring(BEARER_WITH_SPACE.length());
36+
}
37+
return token;
38+
}
39+
3440
public String getOpenApiSpecId() {
3541
return openApiSpecId;
3642
}
@@ -41,7 +47,9 @@ public String getName() {
4147
}
4248

4349
public boolean isTokenPropagation() {
44-
return authConfig != null && authConfig.getTokenPropagation().orElse(false);
50+
return ConfigProvider.getConfig()
51+
.getOptionalValue(getCanonicalAuthConfigPropertyName(AuthConfig.TOKEN_PROPAGATION), Boolean.class)
52+
.orElse(false);
4553
}
4654

4755
public String getTokenForPropagation(MultivaluedMap<String, Object> httpHeaders) {
@@ -51,32 +59,16 @@ public String getTokenForPropagation(MultivaluedMap<String, Object> httpHeaders)
5159
}
5260

5361
public String getHeaderName() {
54-
if (authConfig != null) {
55-
return authConfig.getHeaderName().orElse(null);
56-
}
57-
return null;
62+
return ConfigProvider.getConfig()
63+
.getOptionalValue(getCanonicalAuthConfigPropertyName(AuthConfig.HEADER_NAME), String.class).orElse(null);
5864
}
5965

6066
@Override
6167
public List<OperationAuthInfo> operationsToFilter() {
6268
return applyToOperations;
6369
}
6470

65-
public String getAuthConfigParam(String paramName, String defaultValue) {
66-
if (authConfig != null) {
67-
return authConfig.getConfigParam(paramName).orElse(defaultValue);
68-
}
69-
return defaultValue;
70-
}
71-
72-
protected static String sanitizeBearerToken(String token) {
73-
if (token != null && token.toLowerCase().startsWith(BEARER_WITH_SPACE.toLowerCase())) {
74-
return token.substring(BEARER_WITH_SPACE.length());
75-
}
76-
return token;
77-
}
78-
79-
protected String getCanonicalAuthConfigPropertyName(String authPropertyName) {
71+
public final String getCanonicalAuthConfigPropertyName(String authPropertyName) {
8072
return String.format(CANONICAL_AUTH_CONFIG_PROPERTY_NAME, getOpenApiSpecId(), getName(), authPropertyName);
8173
}
8274
}

client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/ApiKeyAuthenticationProvider.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import jakarta.ws.rs.core.HttpHeaders;
1111
import jakarta.ws.rs.core.UriBuilder;
1212

13+
import org.eclipse.microprofile.config.ConfigProvider;
1314
import org.slf4j.Logger;
1415
import org.slf4j.LoggerFactory;
1516

16-
import io.quarkiverse.openapi.generator.AuthConfig;
1717
import io.quarkiverse.openapi.generator.OpenApiGeneratorException;
1818

1919
/**
@@ -30,9 +30,8 @@ public class ApiKeyAuthenticationProvider extends AbstractAuthProvider {
3030
private final String apiKeyName;
3131

3232
public ApiKeyAuthenticationProvider(final String openApiSpecId, final String name, final ApiKeyIn apiKeyIn,
33-
final String apiKeyName,
34-
final AuthConfig authConfig, List<OperationAuthInfo> operations) {
35-
super(authConfig, name, openApiSpecId, operations);
33+
final String apiKeyName, List<OperationAuthInfo> operations) {
34+
super(name, openApiSpecId, operations);
3635
this.apiKeyIn = apiKeyIn;
3736
this.apiKeyName = apiKeyName;
3837
validateConfig();
@@ -59,16 +58,19 @@ && isUseAuthorizationHeaderValue()) {
5958
}
6059

6160
private String getApiKey() {
62-
final String key = getAuthConfigParam(API_KEY, "");
61+
final String key = ConfigProvider.getConfig()
62+
.getOptionalValue(getCanonicalAuthConfigPropertyName(API_KEY), String.class).orElse("");
6363
if (key.isEmpty()) {
64-
LOGGER.warn("configured " + API_KEY + " property (see application.properties) is empty. hint: configure it.");
64+
LOGGER.warn("configured {} property (see application.properties) is empty. hint: configure it.",
65+
getCanonicalAuthConfigPropertyName(API_KEY));
6566
}
6667
return key;
6768
}
6869

6970
private boolean isUseAuthorizationHeaderValue() {
70-
final String value = getAuthConfigParam(USE_AUTHORIZATION_HEADER_VALUE, "true");
71-
return "true".equals(value);
71+
return ConfigProvider.getConfig()
72+
.getOptionalValue(getCanonicalAuthConfigPropertyName(USE_AUTHORIZATION_HEADER_VALUE), Boolean.class)
73+
.orElse(true);
7274
}
7375

7476
private void validateConfig() {

client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BasicAuthenticationProvider.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
import jakarta.ws.rs.client.ClientRequestContext;
99
import jakarta.ws.rs.core.HttpHeaders;
1010

11-
import io.quarkiverse.openapi.generator.AuthConfig;
11+
import org.eclipse.microprofile.config.ConfigProvider;
12+
1213
import io.quarkiverse.openapi.generator.OpenApiGeneratorException;
1314

1415
/**
@@ -21,18 +22,19 @@ public class BasicAuthenticationProvider extends AbstractAuthProvider {
2122
static final String USER_NAME = "username";
2223
static final String PASSWORD = "password";
2324

24-
public BasicAuthenticationProvider(final String openApiSpecId, String name, final AuthConfig authConfig,
25-
List<OperationAuthInfo> operations) {
26-
super(authConfig, name, openApiSpecId, operations);
25+
public BasicAuthenticationProvider(final String openApiSpecId, String name, List<OperationAuthInfo> operations) {
26+
super(name, openApiSpecId, operations);
2727
validateConfig();
2828
}
2929

3030
private String getUsername() {
31-
return getAuthConfigParam(USER_NAME, "");
31+
return ConfigProvider.getConfig().getOptionalValue(getCanonicalAuthConfigPropertyName(USER_NAME), String.class)
32+
.orElse("");
3233
}
3334

3435
private String getPassword() {
35-
return getAuthConfigParam(PASSWORD, "");
36+
return ConfigProvider.getConfig().getOptionalValue(getCanonicalAuthConfigPropertyName(PASSWORD), String.class)
37+
.orElse("");
3638
}
3739

3840
@Override

client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/BearerAuthenticationProvider.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import jakarta.ws.rs.client.ClientRequestContext;
77
import jakarta.ws.rs.core.HttpHeaders;
88

9-
import io.quarkiverse.openapi.generator.AuthConfig;
9+
import org.eclipse.microprofile.config.ConfigProvider;
1010

1111
/**
1212
* Provides bearer token authentication or any other valid scheme.
@@ -20,8 +20,8 @@ public class BearerAuthenticationProvider extends AbstractAuthProvider {
2020
private final String scheme;
2121

2222
public BearerAuthenticationProvider(final String openApiSpecId, final String name, final String scheme,
23-
final AuthConfig authConfig, List<OperationAuthInfo> operations) {
24-
super(authConfig, name, openApiSpecId, operations);
23+
List<OperationAuthInfo> operations) {
24+
super(name, openApiSpecId, operations);
2525
this.scheme = scheme;
2626
}
2727

@@ -41,6 +41,7 @@ public void filter(ClientRequestContext requestContext) throws IOException {
4141
}
4242

4343
private String getBearerToken() {
44-
return getAuthConfigParam(BEARER_TOKEN, "");
44+
return ConfigProvider.getConfig().getOptionalValue(getCanonicalAuthConfigPropertyName(BEARER_TOKEN), String.class)
45+
.orElse("");
4546
}
4647
}

0 commit comments

Comments
 (0)