Skip to content

Configure authSchemeProvider in service client builder #4032

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@
import software.amazon.awssdk.codegen.utils.AuthUtils;
import software.amazon.awssdk.http.auth.spi.HttpAuthOption;

final class AuthSchemeSpecUtils {
public final class AuthSchemeSpecUtils {
private final IntermediateModel intermediateModel;

AuthSchemeSpecUtils(IntermediateModel intermediateModel) {
public AuthSchemeSpecUtils(IntermediateModel intermediateModel) {
this.intermediateModel = intermediateModel;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
import software.amazon.awssdk.codegen.poet.ClassSpec;
import software.amazon.awssdk.codegen.poet.PoetUtils;
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
import software.amazon.awssdk.codegen.utils.AuthUtils;
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
Expand All @@ -73,13 +74,15 @@ public class BaseClientBuilderClass implements ClassSpec {
private final ClassName builderClassName;
private final String basePackage;
private final EndpointRulesSpecUtils endpointRulesSpecUtils;
private final AuthSchemeSpecUtils authSchemeSpecUtils;

public BaseClientBuilderClass(IntermediateModel model) {
this.model = model;
this.basePackage = model.getMetadata().getFullClientPackageName();
this.builderInterfaceName = ClassName.get(basePackage, model.getMetadata().getBaseBuilderInterface());
this.builderClassName = ClassName.get(basePackage, model.getMetadata().getBaseBuilder());
this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(model);
this.authSchemeSpecUtils = new AuthSchemeSpecUtils(model);
}

@Override
Expand Down Expand Up @@ -115,6 +118,9 @@ public TypeSpec poetSpec() {
builder.addMethod(signingNameMethod());
builder.addMethod(defaultEndpointProviderMethod());

builder.addMethod(authSchemeProviderMethod());
builder.addMethod(defaultAuthSchemeProviderMethod());

if (hasClientContextParams()) {
model.getClientContextParams().forEach((n, m) -> {
builder.addMethod(clientContextParamSetter(n, m));
Expand Down Expand Up @@ -192,7 +198,7 @@ private MethodSpec mergeServiceDefaultsMethod() {
.addCode("return config.merge(c -> c");

builder.addCode(".option($T.ENDPOINT_PROVIDER, defaultEndpointProvider())", SdkClientOption.class);

builder.addCode(".option($T.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())", SdkClientOption.class);

if (defaultAwsAuthSignerMethod().isPresent()) {
builder.addCode(".option($T.SIGNER, defaultSigner())\n", SdkAdvancedClientOption.class);
Expand Down Expand Up @@ -580,6 +586,25 @@ private MethodSpec defaultEndpointProviderMethod() {
.build();
}

private MethodSpec authSchemeProviderMethod() {
return MethodSpec.methodBuilder("authSchemeProvider")
.addModifiers(Modifier.PUBLIC)
.returns(TypeVariableName.get("B"))
.addParameter(authSchemeSpecUtils.providerInterfaceName(), "authSchemeProvider")
.addStatement("clientConfiguration.option($T.AUTH_SCHEME_PROVIDER, authSchemeProvider)",
SdkClientOption.class)
.addStatement("return thisBuilder()")
.build();
}

private MethodSpec defaultAuthSchemeProviderMethod() {
return MethodSpec.methodBuilder("defaultAuthSchemeProvider")
.addModifiers(PRIVATE)
.returns(authSchemeSpecUtils.providerInterfaceName())
.addStatement("return $T.defaultProvider()", authSchemeSpecUtils.providerInterfaceName())
.build();
}

private MethodSpec clientContextParamSetter(String name, ClientContextParam param) {
String setterName = endpointRulesSpecUtils.paramMethodName(name);
String keyName = model.getNamingStrategy().getEnumValueName(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
import software.amazon.awssdk.codegen.poet.ClassSpec;
import software.amazon.awssdk.codegen.poet.PoetUtils;
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
import software.amazon.awssdk.codegen.utils.AuthUtils;
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
Expand All @@ -49,12 +50,14 @@ public class BaseClientBuilderInterface implements ClassSpec {
private final String basePackage;
private final ClassName builderInterfaceName;
private final EndpointRulesSpecUtils endpointRulesSpecUtils;
private final AuthSchemeSpecUtils authSchemeSpecUtils;

public BaseClientBuilderInterface(IntermediateModel model) {
this.model = model;
this.basePackage = model.getMetadata().getFullClientPackageName();
this.builderInterfaceName = ClassName.get(basePackage, model.getMetadata().getBaseBuilderInterface());
this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(model);
this.authSchemeSpecUtils = new AuthSchemeSpecUtils(model);
}

@Override
Expand All @@ -79,6 +82,7 @@ public TypeSpec poetSpec() {
}

builder.addMethod(endpointProviderMethod());
builder.addMethod(authSchemeProviderMethod());

if (hasClientContextParams()) {
model.getClientContextParams().forEach((n, m) -> {
Expand Down Expand Up @@ -155,6 +159,19 @@ private MethodSpec endpointProviderMethod() {
.build();
}

private MethodSpec authSchemeProviderMethod() {
return MethodSpec.methodBuilder("authSchemeProvider")
.addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
.addParameter(authSchemeSpecUtils.providerInterfaceName(), "authSchemeProvider")
.addJavadoc("Set the {@link $T} implementation that will be used by the client to resolve the "
+ "auth scheme for each request. This is optional; if none is provided a "
+ "default implementation will be used the SDK.",
authSchemeSpecUtils.providerInterfaceName())
.returns(TypeVariableName.get("B"))
.addStatement("throw new $T()", UnsupportedOperationException.class)
.build();
}

private MethodSpec clientContextParamSetter(String name, ClientContextParam param) {
String setterName = Utils.unCapitalize(CodegenNamingUtils.pascalCase(name));
TypeName type = endpointRulesSpecUtils.toJavaType(param.getType());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import software.amazon.awssdk.core.signer.Signer;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
Expand All @@ -42,6 +43,7 @@ protected final String serviceName() {
@Override
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())
.option(SdkAdvancedClientOption.TOKEN_SIGNER, defaultTokenSigner()));
Expand Down Expand Up @@ -72,6 +74,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
return JsonEndpointProvider.defaultProvider();
}

public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
return thisBuilder();
}

private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
return JsonAuthSchemeProvider.defaultProvider();
}

private IdentityProvider<? extends TokenIdentity> defaultTokenProvider() {
return DefaultAwsTokenProvider.create();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;

/**
Expand All @@ -21,6 +22,14 @@ default B endpointProvider(JsonEndpointProvider endpointProvider) {
throw new UnsupportedOperationException();
}

/**
* Set the {@link JsonAuthSchemeProvider} implementation that will be used by the client to resolve the auth scheme for
* each request. This is optional; if none is provided a default implementation will be used the SDK.
*/
default B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
throw new UnsupportedOperationException();
}

/**
* Set the token provider to use for bearer token authorization. This is optional, if none is provided, the SDK will
* use {@link software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import software.amazon.awssdk.core.signer.Signer;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.endpoints.JsonClientContextParams;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
Expand Down Expand Up @@ -47,6 +48,7 @@ protected final String serviceName() {
@Override
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
.option(SdkClientOption.SERVICE_CONFIGURATION, ServiceConfiguration.builder().build())
Expand Down Expand Up @@ -143,6 +145,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
return JsonEndpointProvider.defaultProvider();
}

public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
return thisBuilder();
}

private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
return JsonAuthSchemeProvider.defaultProvider();
}

public B serviceConfiguration(ServiceConfiguration serviceConfiguration) {
clientConfiguration.option(SdkClientOption.SERVICE_CONFIGURATION, serviceConfiguration);
return thisBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;

/**
Expand All @@ -28,6 +29,14 @@ default B endpointProvider(JsonEndpointProvider endpointProvider) {
throw new UnsupportedOperationException();
}

/**
* Set the {@link JsonAuthSchemeProvider} implementation that will be used by the client to resolve the auth scheme for
* each request. This is optional; if none is provided a default implementation will be used the SDK.
*/
default B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
throw new UnsupportedOperationException();
}

/**
* Set the token provider to use for bearer token authorization. This is optional, if none is provided, the SDK will
* use {@link software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.core.retry.RetryMode;
import software.amazon.awssdk.core.signer.Signer;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
Expand All @@ -39,6 +40,7 @@ protected final String serviceName() {
@Override
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false));
}
Expand Down Expand Up @@ -80,6 +82,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
return JsonEndpointProvider.defaultProvider();
}

public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
return thisBuilder();
}

private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
return JsonAuthSchemeProvider.defaultProvider();
}

protected static void validateClientOptions(SdkClientConfiguration c) {
Validate.notNull(c.option(SdkAdvancedClientOption.SIGNER),
"The 'overrideConfiguration.advancedOption[SIGNER]' must be configured in the client builder.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor;
import software.amazon.awssdk.services.query.auth.scheme.QueryAuthSchemeProvider;
import software.amazon.awssdk.services.query.endpoints.QueryClientContextParams;
import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider;
import software.amazon.awssdk.services.query.endpoints.internal.QueryEndpointAuthSchemeInterceptor;
Expand Down Expand Up @@ -46,6 +47,7 @@ protected final String serviceName() {
@Override
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())
Expand Down Expand Up @@ -84,6 +86,15 @@ private QueryEndpointProvider defaultEndpointProvider() {
return QueryEndpointProvider.defaultProvider();
}

public B authSchemeProvider(QueryAuthSchemeProvider authSchemeProvider) {
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
return thisBuilder();
}

private QueryAuthSchemeProvider defaultAuthSchemeProvider() {
return QueryAuthSchemeProvider.defaultProvider();
}

public B booleanContextParam(Boolean booleanContextParam) {
clientContextParams.put(QueryClientContextParams.BOOLEAN_CONTEXT_PARAM, booleanContextParam);
return thisBuilder();
Expand Down
5 changes: 5 additions & 0 deletions core/sdk-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@
<artifactId>endpoints-spi</artifactId>
<version>${awsjavasdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>http-auth-spi</artifactId>
<version>${awsjavasdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>utils</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import software.amazon.awssdk.endpoints.EndpointProvider;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.auth.spi.AuthSchemeProvider;
import software.amazon.awssdk.metrics.MetricPublisher;
import software.amazon.awssdk.profiles.ProfileFile;
import software.amazon.awssdk.utils.AttributeMap;
Expand Down Expand Up @@ -184,6 +185,12 @@ public final class SdkClientOption<T> extends ClientOption<T> {
*/
public static final SdkClientOption<EndpointProvider> ENDPOINT_PROVIDER = new SdkClientOption<>(EndpointProvider.class);

/**
* The {@link AuthSchemeProvider} configured on the client.
*/
public static final SdkClientOption<AuthSchemeProvider> AUTH_SCHEME_PROVIDER =
new SdkClientOption<>(AuthSchemeProvider.class);

/**
* The container for any client contexts parameters set on the client.
*/
Expand Down