Skip to content

Commit 46e0c95

Browse files
author
Steven Yuan
committed
feat(experimentalIdentityAndAuth): customize @aws.auth#sigv4 identity providers for the AWS SDK
Register `AwsCustomizeSigv4AuthPlugin` integration to customize `@aws.auth#sigv4` to use: - Browser: a function that throws an error saying `credentials` is missing - Node.js: `decorateDefaultCredentialProvider(credentialDefaultProvider)` from `@aws-sdk/credential-provider-node` and `aws-sdk/client-sts`.
1 parent 515ea2e commit 46e0c95

File tree

3 files changed

+73
-20
lines changed

3 files changed

+73
-20
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddAwsAuthPlugin.java

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555

5656
/**
5757
* Configure clients with AWS auth configurations and plugin.
58+
*
59+
* This is the existing control behavior for `experimentalIdentityAndAuth`.
5860
*/
5961
@SmithyInternalApi
6062
public final class AddAwsAuthPlugin implements TypeScriptIntegration {
@@ -65,17 +67,21 @@ public final class AddAwsAuthPlugin implements TypeScriptIntegration {
6567

6668
private static final Logger LOGGER = Logger.getLogger(AddAwsAuthPlugin.class.getName());
6769

70+
/**
71+
* Integration should only be used if `experimentalIdentityAndAuth` flag is false.
72+
*/
73+
@Override
74+
public boolean matchesSettings(TypeScriptSettings settings) {
75+
return !settings.getExperimentalIdentityAndAuth();
76+
}
77+
6878
@Override
6979
public void addConfigInterfaceFields(
7080
TypeScriptSettings settings,
7181
Model model,
7282
SymbolProvider symbolProvider,
7383
TypeScriptWriter writer
7484
) {
75-
if (settings.getExperimentalIdentityAndAuth()) {
76-
return;
77-
}
78-
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
7985
ServiceShape service = settings.getService(model);
8086
if (!isSigV4Service(service) && isAwsService(service)) {
8187
ServiceTrait serviceTrait = service.getTrait(ServiceTrait.class).get();
@@ -124,14 +130,12 @@ public List<RuntimeClientPlugin> getClientPlugins() {
124130
&& isAwsService(s)
125131
&& !testServiceId(s, "STS")
126132
&& !areAllOptionalAuthOperations(m, s))
127-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
128133
.build(),
129134
RuntimeClientPlugin.builder()
130135
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_CONFIG)
131136
.servicePredicate((m, s) -> isSigV4Service(s)
132137
&& !isAwsService(s)
133138
&& !areAllOptionalAuthOperations(m, s))
134-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
135139
.build(),
136140
RuntimeClientPlugin.builder()
137141
.withConventions(AwsDependency.STS_MIDDLEWARE.dependency,
@@ -140,7 +144,6 @@ && isAwsService(s)
140144
put("stsClientCtor", Symbol.builder().name("STSClient").build());
141145
}})
142146
.servicePredicate((m, s) -> testServiceId(s, "STS"))
143-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
144147
.build(),
145148
RuntimeClientPlugin.builder()
146149
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
@@ -149,29 +152,25 @@ && isAwsService(s)
149152
&& isAwsService(s)
150153
&& !testServiceId(s, "STS")
151154
&& !hasOptionalAuthOperation(m, s))
152-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
153155
.build(),
154156
RuntimeClientPlugin.builder()
155157
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_MIDDLEWARE)
156158
// See operationUsesAwsAuth() below for AwsAuth Middleware customizations.
157159
.servicePredicate((m, s) -> isSigV4Service(s)
158160
&& !isAwsService(s)
159161
&& !hasOptionalAuthOperation(m, s))
160-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
161162
.build(),
162163
RuntimeClientPlugin.builder()
163164
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
164165
.operationPredicate((m, s, o) -> isSigV4Service(s)
165166
&& isAwsService(s)
166167
&& operationUsesAwsAuth(m, s, o))
167-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
168168
.build(),
169169
RuntimeClientPlugin.builder()
170170
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_MIDDLEWARE)
171171
.operationPredicate((m, s, o) -> isSigV4Service(s)
172172
&& !isAwsService(s)
173173
&& operationUsesAwsAuth(m, s, o))
174-
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
175174
.build()
176175

177176
);
@@ -184,10 +183,6 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
184183
SymbolProvider symbolProvider,
185184
LanguageTarget target
186185
) {
187-
if (settings.getExperimentalIdentityAndAuth()) {
188-
return Collections.emptyMap();
189-
}
190-
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
191186
ServiceShape service = settings.getService(model);
192187
if (!isSigV4Service(service) || areAllOptionalAuthOperations(model, service)) {
193188
return Collections.emptyMap();
@@ -234,10 +229,6 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
234229

235230
@Override
236231
public void customize(TypeScriptCodegenContext codegenContext) {
237-
if (codegenContext.settings().getExperimentalIdentityAndAuth()) {
238-
return;
239-
}
240-
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
241232
TypeScriptSettings settings = codegenContext.settings();
242233
Model model = codegenContext.model();
243234
BiConsumer<String, Consumer<TypeScriptWriter>> writerFactory = codegenContext.writerDelegator()::useFileWriter;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package software.amazon.smithy.aws.typescript.codegen.auth.http.integration;
7+
8+
import java.util.List;
9+
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
10+
import software.amazon.smithy.aws.typescript.codegen.AwsDependency;
11+
import software.amazon.smithy.typescript.codegen.LanguageTarget;
12+
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
13+
import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme;
14+
import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex;
15+
import software.amazon.smithy.typescript.codegen.auth.http.integration.AddSigV4AuthPlugin;
16+
import software.amazon.smithy.typescript.codegen.auth.http.integration.HttpAuthTypeScriptIntegration;
17+
18+
/**
19+
* Customize @aws.auth#sigv4 for AWS SDKs.
20+
*
21+
* This is the experimental behavior for `experimentalIdentityAndAuth`.
22+
*/
23+
public class AwsCustomizeSigv4AuthPlugin implements HttpAuthTypeScriptIntegration {
24+
25+
/**
26+
* Integration should only be used if `experimentalIdentityAndAuth` flag is true.
27+
*/
28+
@Override
29+
public boolean matchesSettings(TypeScriptSettings settings) {
30+
return settings.getExperimentalIdentityAndAuth();
31+
}
32+
33+
/**
34+
* Run after default AddSigV4AuthPlugin.
35+
*/
36+
@Override
37+
public List<String> runAfter() {
38+
return List.of(AddSigV4AuthPlugin.class.getCanonicalName());
39+
}
40+
41+
@Override
42+
public void customizeSupportedHttpAuthSchemes(SupportedHttpAuthSchemesIndex supportedHttpAuthSchemesIndex) {
43+
HttpAuthScheme authScheme = supportedHttpAuthSchemesIndex.getHttpAuthScheme(SigV4Trait.ID).toBuilder()
44+
// Current behavior of unconfigured `credentials` is to throw an error.
45+
// This may need to be customized if a service is released with multiple auth schemes.
46+
.putDefaultIdentityProvider(LanguageTarget.BROWSER, w ->
47+
w.write("async () => { throw new Error(\"`credentials` is missing\"); }"))
48+
// Use `@aws-sdk/credential-provider-node` with `@aws-sdk/client-sts` as the
49+
// default identity provider chain for Node.js
50+
.putDefaultIdentityProvider(LanguageTarget.NODE, w -> {
51+
w.addDependency(AwsDependency.STS_CLIENT);
52+
w.addImport("decorateDefaultCredentialProvider", null, AwsDependency.STS_CLIENT);
53+
w.addDependency(AwsDependency.CREDENTIAL_PROVIDER_NODE);
54+
w.addImport("defaultProvider", "credentialDefaultProvider",
55+
AwsDependency.CREDENTIAL_PROVIDER_NODE);
56+
w.write("decorateDefaultCredentialProvider(credentialDefaultProvider)");
57+
})
58+
.build();
59+
supportedHttpAuthSchemesIndex.putHttpAuthScheme(authScheme.getSchemeId(), authScheme);
60+
}
61+
}

codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ software.amazon.smithy.aws.typescript.codegen.AddCrossRegionCopyingPlugin
2323
software.amazon.smithy.aws.typescript.codegen.AddDocumentClientPlugin
2424
software.amazon.smithy.aws.typescript.codegen.AddEndpointDiscoveryPlugin
2525
software.amazon.smithy.aws.typescript.codegen.AddHttpChecksumDependency
26-
software.amazon.smithy.aws.typescript.codegen.AddEventBridgePlugin
26+
software.amazon.smithy.aws.typescript.codegen.AddEventBridgePlugin
27+
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsCustomizeSigv4AuthPlugin

0 commit comments

Comments
 (0)