Skip to content

Commit eef2063

Browse files
authored
Raise exceptions in resolveCredentials instead of creation for StsWebIdentityTokenFileCredentialsProvider (#6553)
1 parent cfafb55 commit eef2063

File tree

3 files changed

+51
-28
lines changed

3 files changed

+51
-28
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "AWS STS",
4+
"contributor": "",
5+
"description": "Raise exceptions in resolveCredentials instead of creation for StsWebIdentityTokenFileCredentialsProvider"
6+
}

services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsWebIdentityTokenFileCredentialsProvider.java

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public final class StsWebIdentityTokenFileCredentialsProvider
6262

6363
private final AwsCredentialsProvider credentialsProvider;
6464
private final RuntimeException loadException;
65-
private final Supplier<AssumeRoleWithWebIdentityRequest> assumeRoleWithWebIdentityRequest;
65+
private Supplier<AssumeRoleWithWebIdentityRequest> assumeRoleWithWebIdentityRequest;
6666

6767
private final Path webIdentityTokenFile;
6868
private final String roleArn;
@@ -71,35 +71,36 @@ public final class StsWebIdentityTokenFileCredentialsProvider
7171

7272
private StsWebIdentityTokenFileCredentialsProvider(Builder builder) {
7373
super(builder, "sts-assume-role-with-web-identity-credentials-provider");
74-
Path webIdentityTokenFile =
75-
builder.webIdentityTokenFile != null ? builder.webIdentityTokenFile
76-
: Paths.get(trim(SdkSystemSetting.AWS_WEB_IDENTITY_TOKEN_FILE
77-
.getStringValueOrThrow()));
78-
79-
String roleArn = builder.roleArn != null ? builder.roleArn
80-
: trim(SdkSystemSetting.AWS_ROLE_ARN.getStringValueOrThrow());
81-
82-
String sessionName = builder.roleSessionName != null ? builder.roleSessionName :
83-
SdkSystemSetting.AWS_ROLE_SESSION_NAME.getStringValue()
84-
.orElse("aws-sdk-java-" + System.currentTimeMillis());
85-
86-
WebIdentityTokenCredentialProperties credentialProperties =
87-
WebIdentityTokenCredentialProperties.builder()
88-
.roleArn(roleArn)
89-
.roleSessionName(builder.roleSessionName)
90-
.webIdentityTokenFile(webIdentityTokenFile)
91-
.build();
92-
93-
this.assumeRoleWithWebIdentityRequest = builder.assumeRoleWithWebIdentityRequestSupplier != null
94-
? builder.assumeRoleWithWebIdentityRequestSupplier
95-
: () -> AssumeRoleWithWebIdentityRequest.builder()
96-
.roleArn(credentialProperties.roleArn())
97-
.roleSessionName(sessionName)
98-
.build();
99-
10074
AwsCredentialsProvider credentialsProviderLocal = null;
10175
RuntimeException loadExceptionLocal = null;
10276
try {
77+
Path webIdentityTokenFile =
78+
builder.webIdentityTokenFile != null ? builder.webIdentityTokenFile
79+
: Paths.get(trim(SdkSystemSetting.AWS_WEB_IDENTITY_TOKEN_FILE
80+
.getStringValueOrThrow()));
81+
82+
String roleArn = builder.roleArn != null ? builder.roleArn
83+
: trim(SdkSystemSetting.AWS_ROLE_ARN.getStringValueOrThrow());
84+
85+
String sessionName = builder.roleSessionName != null ? builder.roleSessionName :
86+
SdkSystemSetting.AWS_ROLE_SESSION_NAME.getStringValue()
87+
.orElse("aws-sdk-java-" + System.currentTimeMillis());
88+
89+
WebIdentityTokenCredentialProperties credentialProperties =
90+
WebIdentityTokenCredentialProperties.builder()
91+
.roleArn(roleArn)
92+
.roleSessionName(builder.roleSessionName)
93+
.webIdentityTokenFile(webIdentityTokenFile)
94+
.build();
95+
96+
this.assumeRoleWithWebIdentityRequest =
97+
builder.assumeRoleWithWebIdentityRequestSupplier != null
98+
? builder.assumeRoleWithWebIdentityRequestSupplier
99+
: () -> AssumeRoleWithWebIdentityRequest.builder()
100+
.roleArn(credentialProperties.roleArn())
101+
.roleSessionName(sessionName)
102+
.build();
103+
103104
AssumeRoleWithWebIdentityRequestSupplier supplier =
104105
AssumeRoleWithWebIdentityRequestSupplier.builder()
105106
.assumeRoleWithWebIdentityRequest(assumeRoleWithWebIdentityRequest.get())
@@ -148,7 +149,9 @@ public AwsCredentials resolveCredentials() {
148149

149150
@Override
150151
protected AwsSessionCredentials getUpdatedCredentials(StsClient stsClient) {
151-
AssumeRoleWithWebIdentityRequest request = assumeRoleWithWebIdentityRequest.get();
152+
AssumeRoleWithWebIdentityRequest request =
153+
assumeRoleWithWebIdentityRequest != null ? assumeRoleWithWebIdentityRequest.get() : null;
154+
152155
notNull(request, "AssumeRoleWithWebIdentityRequest can't be null");
153156
AssumeRoleWithWebIdentityResponse assumeRoleWithWebIdentityResponse = stsClient.assumeRoleWithWebIdentity(request);
154157
return fromStsCredentials(assumeRoleWithWebIdentityResponse.credentials(),

services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsWebIdentityTokenCredentialProviderTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,18 @@ void createAssumeRoleWithWebIdentityTokenCredentialsProviderStsClientBuilder() {
9797
provider.resolveCredentials();
9898
Mockito.verify(stsClient, Mockito.times(1)).assumeRoleWithWebIdentity(Mockito.any(AssumeRoleWithWebIdentityRequest.class));
9999
}
100+
101+
@Test
102+
void createAssumeRoleWithWebIdentityTokenCredentialsProvider_raisesInResolveCredentials() {
103+
ENVIRONMENT_VARIABLE_HELPER.remove(SdkSystemSetting.AWS_WEB_IDENTITY_TOKEN_FILE.environmentVariable());
104+
105+
StsWebIdentityTokenFileCredentialsProvider provider =
106+
StsWebIdentityTokenFileCredentialsProvider.builder().stsClient(stsClient)
107+
.refreshRequest(r -> r.build())
108+
.roleArn("someRole")
109+
.roleSessionName("tempRoleSession")
110+
.build();
111+
// exception should be raised lazily when resolving credentials, not at creation time.
112+
Assert.assertThrows(IllegalStateException.class, provider::resolveCredentials);
113+
}
100114
}

0 commit comments

Comments
 (0)