Skip to content

Commit 5845142

Browse files
dagnirjoviegas
andauthored
Add support for bearer token auth (#3401)
This adds support for bearer token authentication. Co-authored-by: John Viegas <joviegas@amazon.com>
1 parent a7b004f commit 5845142

File tree

116 files changed

+7949
-173
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+7949
-173
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/IntermediateModelBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ private void linkAuthorizationToRequestShapeForAwsProtocol(AuthType authType, Sh
223223
case V4_UNSIGNED_BODY:
224224
shape.setRequestSignerClassFqcn("software.amazon.awssdk.auth.signer.Aws4UnsignedPayloadSigner");
225225
break;
226+
case BEARER:
227+
shape.setRequestSignerClassFqcn("software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner");
228+
break;
226229
case NONE:
227230
break;
228231
default:

codegen/src/main/java/software/amazon/awssdk/codegen/model/service/AuthType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public enum AuthType {
2626
V4("v4"),
2727
V4_UNSIGNED_BODY("v4-unsigned-body"),
2828
S3("s3"),
29-
S3V4("s3v4")
29+
S3V4("s3v4"),
30+
BEARER("bearer")
3031
;
3132

3233
private final String value;

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@
2121
import com.squareup.javapoet.TypeSpec;
2222
import javax.lang.model.element.Modifier;
2323
import software.amazon.awssdk.annotations.SdkInternalApi;
24+
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
25+
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
2426
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2527
import software.amazon.awssdk.codegen.poet.ClassSpec;
2628
import software.amazon.awssdk.codegen.poet.PoetUtils;
29+
import software.amazon.awssdk.codegen.utils.BearerAuthUtils;
2730

2831
public class AsyncClientBuilderClass implements ClassSpec {
2932
private final IntermediateModel model;
@@ -61,6 +64,10 @@ public TypeSpec poetSpec() {
6164
}
6265
}
6366

67+
if (BearerAuthUtils.usesBearerAuth(model)) {
68+
builder.addMethod(bearerTokenProviderMethod());
69+
}
70+
6471
return builder.addMethod(buildClientMethod()).build();
6572
}
6673

@@ -96,6 +103,17 @@ private MethodSpec buildClientMethod() {
96103
.build();
97104
}
98105

106+
private MethodSpec bearerTokenProviderMethod() {
107+
return MethodSpec.methodBuilder("tokenProvider").addModifiers(Modifier.PUBLIC)
108+
.addAnnotation(Override.class)
109+
.addParameter(SdkTokenProvider.class, "tokenProvider")
110+
.returns(builderClassName)
111+
.addStatement("clientConfiguration.option($T.TOKEN_PROVIDER, tokenProvider)",
112+
AwsClientOption.class)
113+
.addStatement("return this")
114+
.build();
115+
}
116+
99117
@Override
100118
public ClassName className() {
101119
return builderClassName;

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import javax.lang.model.element.Modifier;
3434
import software.amazon.awssdk.annotations.SdkInternalApi;
3535
import software.amazon.awssdk.auth.signer.Aws4Signer;
36+
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
37+
import software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider;
38+
import software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner;
3639
import software.amazon.awssdk.awscore.client.builder.AwsDefaultClientBuilder;
3740
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
3841
import software.amazon.awssdk.codegen.internal.Utils;
@@ -41,6 +44,7 @@
4144
import software.amazon.awssdk.codegen.model.service.AuthType;
4245
import software.amazon.awssdk.codegen.poet.ClassSpec;
4346
import software.amazon.awssdk.codegen.poet.PoetUtils;
47+
import software.amazon.awssdk.codegen.utils.BearerAuthUtils;
4448
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
4549
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
4650
import software.amazon.awssdk.core.client.config.SdkClientOption;
@@ -99,16 +103,22 @@ public TypeSpec poetSpec() {
99103
mergeInternalDefaultsMethod().ifPresent(builder::addMethod);
100104

101105
builder.addMethod(finalizeServiceConfigurationMethod());
102-
builder.addMethod(defaultSignerMethod());
106+
defaultAwsAuthSignerMethod().ifPresent(builder::addMethod);
103107
builder.addMethod(signingNameMethod());
104108

105109
if (model.getCustomizationConfig().getServiceConfig().getClassName() != null) {
106110
builder.addMethod(setServiceConfigurationMethod())
107111
.addMethod(beanStyleSetServiceConfigurationMethod());
108112
}
109113

114+
if (BearerAuthUtils.usesBearerAuth(model)) {
115+
builder.addMethod(defaultBearerTokenProviderMethod());
116+
builder.addMethod(defaultTokenAuthSignerMethod());
117+
}
118+
110119
addServiceHttpConfigIfNeeded(builder, model);
111120

121+
112122
return builder.build();
113123
}
114124

@@ -127,12 +137,13 @@ private MethodSpec signingNameMethod() {
127137
.build();
128138
}
129139

130-
private MethodSpec defaultSignerMethod() {
131-
return MethodSpec.methodBuilder("defaultSigner")
132-
.returns(Signer.class)
133-
.addModifiers(PRIVATE)
134-
.addCode(signerDefinitionMethodBody())
135-
.build();
140+
private Optional<MethodSpec> defaultAwsAuthSignerMethod() {
141+
return awsAuthSignerDefinitionMethodBody().map(body -> MethodSpec.methodBuilder("defaultSigner")
142+
.returns(Signer.class)
143+
.addModifiers(PRIVATE)
144+
.addCode(body)
145+
.build());
146+
136147
}
137148

138149
private MethodSpec serviceEndpointPrefixMethod() {
@@ -161,18 +172,25 @@ private MethodSpec mergeServiceDefaultsMethod() {
161172
.addModifiers(PROTECTED, FINAL)
162173
.returns(SdkClientConfiguration.class)
163174
.addParameter(SdkClientConfiguration.class, "config")
164-
.addCode("return config.merge(c -> c.option($T.SIGNER, defaultSigner())\n",
165-
SdkAdvancedClientOption.class)
166-
.addCode(" .option($T"
167-
+ ".CRC32_FROM_COMPRESSED_DATA_ENABLED, $L)",
168-
SdkClientOption.class, crc32FromCompressedDataEnabled);
175+
.addCode("return config.merge(c -> c");
176+
177+
if (defaultAwsAuthSignerMethod().isPresent()) {
178+
builder.addCode(".option($T.SIGNER, defaultSigner())\n", SdkAdvancedClientOption.class);
179+
}
180+
builder.addCode(".option($T.CRC32_FROM_COMPRESSED_DATA_ENABLED, $L)\n",
181+
SdkClientOption.class, crc32FromCompressedDataEnabled);
169182

170183
String clientConfigClassName = model.getCustomizationConfig().getServiceConfig().getClassName();
171184
if (StringUtils.isNotBlank(clientConfigClassName)) {
172-
builder.addCode(".option($T.SERVICE_CONFIGURATION, $T.builder().build())",
185+
builder.addCode(".option($T.SERVICE_CONFIGURATION, $T.builder().build())\n",
173186
SdkClientOption.class, ClassName.bestGuess(clientConfigClassName));
174187
}
175188

189+
if (BearerAuthUtils.usesBearerAuth(model)) {
190+
builder.addCode(".option($T.TOKEN_PROVIDER, defaultTokenProvider())\n", AwsClientOption.class);
191+
builder.addCode(".option($T.TOKEN_SIGNER, defaultTokenSigner())", SdkAdvancedClientOption.class);
192+
}
193+
176194
builder.addCode(");");
177195
return builder.build();
178196
}
@@ -368,14 +386,16 @@ private CodeBlock serviceSpecificHttpConfigMethodBody(String serviceDefaultFqcn,
368386
return builder.build();
369387
}
370388

371-
private CodeBlock signerDefinitionMethodBody() {
389+
private Optional<CodeBlock> awsAuthSignerDefinitionMethodBody() {
372390
AuthType authType = model.getMetadata().getAuthType();
373391
switch (authType) {
374392
case V4:
375-
return v4SignerDefinitionMethodBody();
393+
return Optional.of(v4SignerDefinitionMethodBody());
376394
case S3:
377395
case S3V4:
378-
return s3SignerDefinitionMethodBody();
396+
return Optional.of(s3SignerDefinitionMethodBody());
397+
case BEARER:
398+
return Optional.empty();
379399
default:
380400
throw new UnsupportedOperationException("Unsupported signer type: " + authType);
381401
}
@@ -385,11 +405,28 @@ private CodeBlock v4SignerDefinitionMethodBody() {
385405
return CodeBlock.of("return $T.create();", Aws4Signer.class);
386406
}
387407

408+
388409
private CodeBlock s3SignerDefinitionMethodBody() {
389410
return CodeBlock.of("return $T.create();\n",
390411
ClassName.get("software.amazon.awssdk.auth.signer", "AwsS3V4Signer"));
391412
}
392413

414+
private MethodSpec defaultBearerTokenProviderMethod() {
415+
return MethodSpec.methodBuilder("defaultTokenProvider")
416+
.returns(SdkTokenProvider.class)
417+
.addModifiers(PRIVATE)
418+
.addStatement("return $T.create()", DefaultAwsTokenProvider.class)
419+
.build();
420+
}
421+
422+
private MethodSpec defaultTokenAuthSignerMethod() {
423+
return MethodSpec.methodBuilder("defaultTokenSigner")
424+
.returns(Signer.class)
425+
.addModifiers(PRIVATE)
426+
.addStatement("return $T.create()", BearerTokenSigner.class)
427+
.build();
428+
}
429+
393430
@Override
394431
public ClassName className() {
395432
return builderClassName;

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderInterface.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@
2424
import com.squareup.javapoet.TypeVariableName;
2525
import java.util.function.Consumer;
2626
import javax.lang.model.element.Modifier;
27+
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
28+
import software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider;
29+
import software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner;
2730
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
2831
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2932
import software.amazon.awssdk.codegen.poet.ClassSpec;
3033
import software.amazon.awssdk.codegen.poet.PoetUtils;
34+
import software.amazon.awssdk.codegen.utils.BearerAuthUtils;
35+
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
3136

3237

3338
public class BaseClientBuilderInterface implements ClassSpec {
@@ -62,6 +67,10 @@ public TypeSpec poetSpec() {
6267
builder.addMethod(serviceConfigurationConsumerBuilderMethod());
6368
}
6469

70+
if (generateTokenProviderMethod()) {
71+
builder.addMethod(tokenProviderMethod());
72+
}
73+
6574
return builder.build();
6675
}
6776

@@ -113,6 +122,29 @@ private MethodSpec serviceConfigurationConsumerBuilderMethod() {
113122
.build();
114123
}
115124

125+
private boolean generateTokenProviderMethod() {
126+
return BearerAuthUtils.usesBearerAuth(model);
127+
}
128+
129+
private MethodSpec tokenProviderMethod() {
130+
return MethodSpec.methodBuilder("tokenProvider")
131+
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
132+
.returns(TypeVariableName.get("B"))
133+
.addParameter(SdkTokenProvider.class, "tokenProvider")
134+
.addJavadoc("Set the token provider to use for bearer token authorization. This is optional, if none "
135+
+ "is provided, the SDK will use {@link $T}.\n"
136+
+ "<p>\n"
137+
+ "If the service, or any of its operations require Bearer Token Authorization, then the "
138+
+ "SDK will default to this token provider to retrieve the token to use for authorization.\n"
139+
+ "<p>\n"
140+
+ "This provider works in conjunction with the {@code $T.TOKEN_SIGNER} set on the client. "
141+
+ "By default it is {@link $T}.",
142+
DefaultAwsTokenProvider.class,
143+
SdkAdvancedClientOption.class,
144+
BearerTokenSigner.class)
145+
.build();
146+
}
147+
116148
@Override
117149
public ClassName className() {
118150
return builderInterfaceName;

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@
2121
import com.squareup.javapoet.TypeSpec;
2222
import javax.lang.model.element.Modifier;
2323
import software.amazon.awssdk.annotations.SdkInternalApi;
24+
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
25+
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
2426
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2527
import software.amazon.awssdk.codegen.poet.ClassSpec;
2628
import software.amazon.awssdk.codegen.poet.PoetUtils;
29+
import software.amazon.awssdk.codegen.utils.BearerAuthUtils;
2730

2831
public class SyncClientBuilderClass implements ClassSpec {
2932
private final IntermediateModel model;
@@ -61,6 +64,10 @@ public TypeSpec poetSpec() {
6164
}
6265
}
6366

67+
if (BearerAuthUtils.usesBearerAuth(model)) {
68+
builder.addMethod(tokenProviderMethodImpl());
69+
}
70+
6471
return builder.addMethod(buildClientMethod()).build();
6572
}
6673

@@ -96,6 +103,17 @@ private MethodSpec buildClientMethod() {
96103
.build();
97104
}
98105

106+
private MethodSpec tokenProviderMethodImpl() {
107+
return MethodSpec.methodBuilder("tokenProvider").addModifiers(Modifier.PUBLIC)
108+
.addAnnotation(Override.class)
109+
.addParameter(SdkTokenProvider.class, "tokenProvider")
110+
.returns(builderClassName)
111+
.addStatement("clientConfiguration.option($T.TOKEN_PROVIDER, tokenProvider)",
112+
AwsClientOption.class)
113+
.addStatement("return this")
114+
.build();
115+
}
116+
99117
@Override
100118
public ClassName className() {
101119
return builderClassName;

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public CodeBlock executionHandler(OperationModel opModel) {
175175
.add(".withErrorResponseHandler(errorResponseHandler)\n")
176176
.add(hostPrefixExpression(opModel))
177177
.add(discoveredEndpoint(opModel))
178+
.add(credentialType(opModel, model))
178179
.add(".withInput($L)\n", opModel.getInput().getVariableName())
179180
.add(".withMetricCollector(apiCallMetricCollector)")
180181
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))
@@ -244,6 +245,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
244245
.add(".withMetricCollector(apiCallMetricCollector)\n")
245246
.add(hostPrefixExpression(opModel))
246247
.add(discoveredEndpoint(opModel))
248+
.add(credentialType(opModel, model))
247249
.add(asyncRequestBody)
248250
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))
249251
.add(HttpChecksumTrait.create(opModel))

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/ProtocolSpec.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3434
import software.amazon.awssdk.codegen.model.service.AuthType;
3535
import software.amazon.awssdk.codegen.poet.PoetExtension;
36+
import software.amazon.awssdk.codegen.utils.BearerAuthUtils;
37+
import software.amazon.awssdk.core.CredentialType;
3638
import software.amazon.awssdk.core.client.handler.SyncClientHandler;
3739
import software.amazon.awssdk.core.runtime.transform.AsyncStreamingRequestMarshaller;
3840
import software.amazon.awssdk.core.runtime.transform.StreamingRequestMarshaller;
@@ -110,6 +112,15 @@ default String discoveredEndpoint(OperationModel opModel) {
110112
: "";
111113
}
112114

115+
default CodeBlock credentialType(OperationModel opModel, IntermediateModel model) {
116+
117+
if (BearerAuthUtils.isOpBearerAuth(model, opModel)) {
118+
return CodeBlock.of(".credentialType($T.TOKEN)\n", CredentialType.class);
119+
} else {
120+
return CodeBlock.of("");
121+
}
122+
}
123+
113124
/**
114125
* For sync streaming operations, wrap request marshaller in {@link StreamingRequestMarshaller} class.
115126
*/

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/QueryProtocolSpec.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public CodeBlock executionHandler(OperationModel opModel) {
111111
.add(".withErrorResponseHandler(errorResponseHandler)\n")
112112
.add(hostPrefixExpression(opModel))
113113
.add(discoveredEndpoint(opModel))
114+
.add(credentialType(opModel, intermediateModel))
114115
.add(".withInput($L)", opModel.getInput().getVariableName())
115116
.add(".withMetricCollector(apiCallMetricCollector)")
116117
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))
@@ -146,6 +147,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
146147
asyncMarshaller(intermediateModel, opModel, marshaller, "protocolFactory"))
147148
.add(".withResponseHandler(responseHandler)\n")
148149
.add(".withErrorResponseHandler(errorResponseHandler)\n")
150+
.add(credentialType(opModel, intermediateModel))
149151
.add(".withMetricCollector(apiCallMetricCollector)\n")
150152
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))
151153
.add(HttpChecksumTrait.create(opModel))

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/XmlProtocolSpec.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ public CodeBlock executionHandler(OperationModel opModel) {
131131
.add(".withMetricCollector(apiCallMetricCollector)\n" +
132132
hostPrefixExpression(opModel) +
133133
discoveredEndpoint(opModel))
134+
.add(credentialType(opModel, model))
134135
.add(".withInput($L)", opModel.getInput().getVariableName())
135136
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))
136137
.add(HttpChecksumTrait.create(opModel))
@@ -207,6 +208,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
207208
}
208209

209210
builder.add(hostPrefixExpression(opModel))
211+
.add(credentialType(opModel, model))
210212
.add(".withMetricCollector(apiCallMetricCollector)\n")
211213
.add(asyncRequestBody(opModel))
212214
.add(HttpChecksumRequiredTrait.putHttpChecksumAttribute(opModel))

0 commit comments

Comments
 (0)