Skip to content

Commit 7a78bfa

Browse files
authored
Minor refactoring on auth scheme provider: rename ModeledAuthSchemePr… (#6547)
* Minor refactoring on auth scheme provider: rename ModeledAuthSchemeProvider to FallbackAuthSchemeProvider and add documentations * Mention customizaton config
1 parent f7847e5 commit 7a78bfa

File tree

7 files changed

+65
-30
lines changed

7 files changed

+65
-30
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeSpecUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ public ClassName defaultAuthSchemeProviderName() {
8787
return ClassName.get(internalPackage(), "Default" + providerInterfaceName().simpleName());
8888
}
8989

90-
public ClassName modeledAuthSchemeProviderName() {
91-
return ClassName.get(internalPackage(), "Modeled" + providerInterfaceName().simpleName());
90+
public ClassName fallbackAuthSchemeProviderName() {
91+
return ClassName.get(internalPackage(), "Fallback" + providerInterfaceName().simpleName());
9292
}
9393

9494
public ClassName preferredAuthSchemeProviderName() {

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/EndpointBasedAuthSchemeProviderSpec.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,20 @@
4949
import software.amazon.awssdk.utils.CompletableFutureUtils;
5050
import software.amazon.awssdk.utils.Validate;
5151

52+
/**
53+
* Generates an auth scheme provider that resolves authentication schemes from endpoint rules.
54+
* <p>
55+
* This class creates a provider that determines authentication schemes dynamically based on the resolved endpoint's auth scheme
56+
* attributes. It first resolves the endpoint using endpoint rules, then extracts auth scheme information from the endpoint's
57+
* attributes. If the endpoint doesn't specify auth schemes (for example, a custom endpoint provider is used), it delegates to the
58+
* fallback provider, which returns the default auth schemes defined in {@link AuthTypeToSigV4Default}
59+
* <p>
60+
* The generated provider handles AWS signature versions (SigV4, SigV4a) and service-specific schemes (like S3 Express),
61+
* translating endpoint auth scheme metadata into {@link AuthSchemeOption} instances with appropriate signer properties.
62+
* <p>
63+
* This provider is only generated for services with endpoint-based auth enabled
64+
* ({@code isEnableEndpointAuthSchemeParams() = true}).
65+
*/
5266
public class EndpointBasedAuthSchemeProviderSpec implements ClassSpec {
5367
private final AuthSchemeSpecUtils authSchemeSpecUtils;
5468
private final EndpointRulesSpecUtils endpointRulesSpecUtils;
@@ -124,9 +138,9 @@ private MethodSpec endpointProvider() {
124138
}
125139

126140
private FieldSpec modeledResolverInstance() {
127-
return FieldSpec.builder(authSchemeSpecUtils.providerInterfaceName(), "MODELED_RESOLVER")
141+
return FieldSpec.builder(authSchemeSpecUtils.providerInterfaceName(), "FALLBACK_RESOLVER")
128142
.addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
129-
.initializer("$T.create()", authSchemeSpecUtils.modeledAuthSchemeProviderName())
143+
.initializer("$T.create()", authSchemeSpecUtils.fallbackAuthSchemeProviderName())
130144
.build();
131145
}
132146

@@ -159,7 +173,7 @@ private MethodSpec resolveAuthSchemeMethod() {
159173
spec.addStatement("$T authSchemes = endpoint.attribute($T.AUTH_SCHEMES)",
160174
ParameterizedTypeName.get(List.class, EndpointAuthScheme.class), AwsEndpointAttribute.class);
161175
spec.beginControlFlow("if (authSchemes == null)");
162-
spec.addStatement("return MODELED_RESOLVER.resolveAuthScheme(params)");
176+
spec.addStatement("return FALLBACK_RESOLVER.resolveAuthScheme(params)");
163177
spec.endControlFlow();
164178

165179

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/ModelBasedAuthSchemeProviderSpec.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,28 @@
3131
import software.amazon.awssdk.codegen.poet.PoetUtils;
3232
import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeOption;
3333

34+
/**
35+
* Generates an auth scheme provider implementation based on the service model's authentication configuration.
36+
* <p>
37+
* This class creates a provider that resolves authentication schemes for SDK operations. It supports both
38+
* service-level default auth schemes and per-operation auth scheme overrides. When operations have different
39+
* auth requirements, it generates a switch statement to return the appropriate schemes based on the operation name.
40+
* <p>
41+
* The generated provider implements the auth scheme provider interface and returns an ordered list of
42+
* {@link AuthSchemeOption} instances that the SDK will attempt in sequence during authentication.
43+
* <p>
44+
* <b>Usage Scenarios:</b>
45+
* <ul>
46+
* <li><b>Services without endpoint-based auth:</b> The generated class serves as the default auth scheme provider,
47+
* directly implementing all auth scheme resolution logic based on the service model.</li>
48+
*
49+
* <li><b>Services with endpoint-based auth</b>(enabled through enableEndpointAuthSchemeParams customization config): The
50+
* generated class is named with a "Fallback" prefix and works
51+
* alongside the endpoint-based provider. It acts as a fallback when endpoint rules don't specify auth schemes, which could
52+
* happen if the endpoint provider is overridden by users. The auth schemes are derived from hardcoded
53+
* {@link AuthTypeToSigV4Default}</li>
54+
* </ul>
55+
*/
3456
public class ModelBasedAuthSchemeProviderSpec implements ClassSpec {
3557
private final AuthSchemeSpecUtils authSchemeSpecUtils;
3658
private final AuthSchemeCodegenKnowledgeIndex knowledgeIndex;
@@ -43,7 +65,7 @@ public ModelBasedAuthSchemeProviderSpec(IntermediateModel intermediateModel) {
4365
@Override
4466
public ClassName className() {
4567
if (authSchemeSpecUtils.useEndpointBasedAuthProvider()) {
46-
return authSchemeSpecUtils.modeledAuthSchemeProviderName();
68+
return authSchemeSpecUtils.fallbackAuthSchemeProviderName();
4769
}
4870
return authSchemeSpecUtils.defaultAuthSchemeProviderName();
4971
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/query-endpoint-auth-params-auth-scheme-endpoint-provider-without-allowlist.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
public final class DefaultQueryAuthSchemeProvider implements QueryAuthSchemeProvider {
3131
private static final DefaultQueryAuthSchemeProvider DEFAULT = new DefaultQueryAuthSchemeProvider();
3232

33-
private static final QueryAuthSchemeProvider MODELED_RESOLVER = ModeledQueryAuthSchemeProvider.create();
33+
private static final QueryAuthSchemeProvider FALLBACK_RESOLVER = FallbackQueryAuthSchemeProvider.create();
3434

3535
private static final QueryEndpointProvider DELEGATE = QueryEndpointProvider.defaultProvider();
3636

@@ -54,7 +54,7 @@ public List<AuthSchemeOption> resolveAuthScheme(QueryAuthSchemeParams params) {
5454
Endpoint endpoint = CompletableFutureUtils.joinLikeSync(endpointProvider(params).resolveEndpoint(endpointParameters));
5555
List<EndpointAuthScheme> authSchemes = endpoint.attribute(AwsEndpointAttribute.AUTH_SCHEMES);
5656
if (authSchemes == null) {
57-
return MODELED_RESOLVER.resolveAuthScheme(params);
57+
return FALLBACK_RESOLVER.resolveAuthScheme(params);
5858
}
5959
List<AuthSchemeOption> options = new ArrayList<>();
6060
for (EndpointAuthScheme authScheme : authSchemes) {

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/query-endpoint-auth-params-auth-scheme-endpoint-provider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
public final class DefaultQueryAuthSchemeProvider implements QueryAuthSchemeProvider {
3131
private static final DefaultQueryAuthSchemeProvider DEFAULT = new DefaultQueryAuthSchemeProvider();
3232

33-
private static final QueryAuthSchemeProvider MODELED_RESOLVER = ModeledQueryAuthSchemeProvider.create();
33+
private static final QueryAuthSchemeProvider FALLBACK_RESOLVER = FallbackQueryAuthSchemeProvider.create();
3434

3535
private static final QueryEndpointProvider DELEGATE = QueryEndpointProvider.defaultProvider();
3636

@@ -50,7 +50,7 @@ public List<AuthSchemeOption> resolveAuthScheme(QueryAuthSchemeParams params) {
5050
Endpoint endpoint = CompletableFutureUtils.joinLikeSync(endpointProvider(params).resolveEndpoint(endpointParameters));
5151
List<EndpointAuthScheme> authSchemes = endpoint.attribute(AwsEndpointAttribute.AUTH_SCHEMES);
5252
if (authSchemes == null) {
53-
return MODELED_RESOLVER.resolveAuthScheme(params);
53+
return FALLBACK_RESOLVER.resolveAuthScheme(params);
5454
}
5555
List<AuthSchemeOption> options = new ArrayList<>();
5656
for (EndpointAuthScheme authScheme : authSchemes) {

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/query-endpoint-auth-params-auth-scheme-modeled-provider.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
* express or implied. See the License for the specific language governing
1313
* permissions and limitations under the License.
1414
*/
15-
1615
package software.amazon.awssdk.services.query.auth.scheme.internal;
1716

1817
import java.util.ArrayList;
@@ -27,31 +26,31 @@
2726

2827
@Generated("software.amazon.awssdk:codegen")
2928
@SdkInternalApi
30-
public final class ModeledQueryAuthSchemeProvider implements QueryAuthSchemeProvider {
31-
private static final ModeledQueryAuthSchemeProvider DEFAULT = new ModeledQueryAuthSchemeProvider();
29+
public final class FallbackQueryAuthSchemeProvider implements QueryAuthSchemeProvider {
30+
private static final FallbackQueryAuthSchemeProvider DEFAULT = new FallbackQueryAuthSchemeProvider();
3231

33-
private ModeledQueryAuthSchemeProvider() {
32+
private FallbackQueryAuthSchemeProvider() {
3433
}
3534

36-
public static ModeledQueryAuthSchemeProvider create() {
35+
public static FallbackQueryAuthSchemeProvider create() {
3736
return DEFAULT;
3837
}
3938

4039
@Override
4140
public List<AuthSchemeOption> resolveAuthScheme(QueryAuthSchemeParams params) {
4241
List<AuthSchemeOption> options = new ArrayList<>();
4342
switch (params.operation()) {
44-
case "BearerAuthOperation":
45-
options.add(AuthSchemeOption.builder().schemeId("smithy.api#httpBearerAuth").build());
46-
break;
47-
case "OperationWithNoneAuthType":
48-
options.add(AuthSchemeOption.builder().schemeId("smithy.api#noAuth").build());
49-
break;
50-
default:
51-
options.add(AuthSchemeOption.builder().schemeId("aws.auth#sigv4")
52-
.putSignerProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "query-service")
53-
.putSignerProperty(AwsV4HttpSigner.REGION_NAME, params.region().id()).build());
54-
break;
43+
case "BearerAuthOperation":
44+
options.add(AuthSchemeOption.builder().schemeId("smithy.api#httpBearerAuth").build());
45+
break;
46+
case "OperationWithNoneAuthType":
47+
options.add(AuthSchemeOption.builder().schemeId("smithy.api#noAuth").build());
48+
break;
49+
default:
50+
options.add(AuthSchemeOption.builder().schemeId("aws.auth#sigv4")
51+
.putSignerProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "query-service")
52+
.putSignerProperty(AwsV4HttpSigner.REGION_NAME, params.region().id()).build());
53+
break;
5554
}
5655
return Collections.unmodifiableList(options);
5756
}

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/s3express/S3ExpressPluginTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import software.amazon.awssdk.services.s3.S3ServiceClientConfiguration;
2828
import software.amazon.awssdk.services.s3.auth.scheme.S3AuthSchemeProvider;
2929
import software.amazon.awssdk.services.s3.auth.scheme.internal.DefaultS3AuthSchemeProvider;
30-
import software.amazon.awssdk.services.s3.auth.scheme.internal.ModeledS3AuthSchemeProvider;
30+
import software.amazon.awssdk.services.s3.auth.scheme.internal.FallbackS3AuthSchemeProvider;
3131
import software.amazon.awssdk.services.s3.internal.S3ServiceClientConfigurationBuilder;
3232
import software.amazon.awssdk.services.s3.s3express.S3ExpressAuthScheme;
3333

@@ -68,12 +68,12 @@ void s3Config_withDefaultS3AuthSchemeProvider_wrapsExistingProvider() {
6868
@Test
6969
void s3Config_withExistingModeledS3AuthSchemeProvider_wrapsExistingProvider() {
7070
S3ServiceClientConfiguration.Builder s3Config = new S3ServiceClientConfigurationBuilder()
71-
.authSchemeProvider(ModeledS3AuthSchemeProvider.create());
72-
assertThat(s3Config.authSchemeProvider()).isInstanceOf(ModeledS3AuthSchemeProvider.class);
71+
.authSchemeProvider(FallbackS3AuthSchemeProvider.create());
72+
assertThat(s3Config.authSchemeProvider()).isInstanceOf(FallbackS3AuthSchemeProvider.class);
7373

7474
S3_EXPRESS_PLUGIN.configureClient(s3Config);
7575
assertThat(s3Config.authSchemeProvider()).isInstanceOf(S3ExpressAuthSchemeProvider.class);
76-
assertThat(getDelegateProvider(s3Config)).isInstanceOf(ModeledS3AuthSchemeProvider.class);
76+
assertThat(getDelegateProvider(s3Config)).isInstanceOf(FallbackS3AuthSchemeProvider.class);
7777
}
7878

7979
private S3AuthSchemeProvider getDelegateProvider(S3ServiceClientConfiguration.Builder s3Config) {

0 commit comments

Comments
 (0)