Skip to content

Commit ebf0b14

Browse files
authored
Merge pull request #3779 from yue9944882/refactor/remove-eks-signer
Refactor Remove EKS related signer impl, instead use AWS SDK provided signer
2 parents c81705a + e210337 commit ebf0b14

File tree

5 files changed

+35
-618
lines changed

5 files changed

+35
-618
lines changed

util/src/main/java/io/kubernetes/client/util/credentials/EKSAuthentication.java

+35-35
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,23 @@
1212
*/
1313
package io.kubernetes.client.util.credentials;
1414

15-
import com.amazonaws.auth.AWSSessionCredentials;
15+
import com.amazonaws.DefaultRequest;
16+
import com.amazonaws.auth.AWS4Signer;
1617
import com.amazonaws.auth.AWSSessionCredentialsProvider;
18+
import com.amazonaws.http.HttpMethodName;
19+
import com.amazonaws.services.securitytoken.model.GetCallerIdentityRequest;
20+
import com.amazonaws.util.RuntimeHttpUtils;
1721
import io.kubernetes.client.openapi.ApiClient;
18-
import io.kubernetes.client.util.eks.AWS4STSSigner;
19-
import io.kubernetes.client.util.eks.AWS4SignerBase;
2022
import org.slf4j.Logger;
2123
import org.slf4j.LoggerFactory;
2224

23-
import java.net.MalformedURLException;
2425
import java.net.URI;
25-
import java.net.URISyntaxException;
26+
import java.nio.charset.StandardCharsets;
27+
import java.time.Clock;
2628
import java.time.Instant;
2729
import java.time.temporal.ChronoUnit;
2830
import java.util.Base64;
29-
import java.util.HashMap;
31+
import java.util.Date;
3032

3133
/**
3234
* EKS cluster authentication which generates a bearer token from AWS AK/SK. It doesn't require an "aws"
@@ -55,45 +57,43 @@ public EKSAuthentication(AWSSessionCredentialsProvider provider, String region,
5557
expirySeconds = MAX_EXPIRY_SECONDS;
5658
}
5759
this.expirySeconds = expirySeconds;
60+
this.stsEndpoint = URI.create("https://sts." + this.region + ".amazonaws.com");
5861
}
5962

6063
private static final int MAX_EXPIRY_SECONDS = 60 * 15;
6164
private final AWSSessionCredentialsProvider provider;
6265
private final String region;
6366
private final String clusterName;
67+
private final URI stsEndpoint;
6468

6569
private final int expirySeconds;
6670

6771
@Override
6872
public void provide(ApiClient client) {
69-
URI uri = URI.create("https://sts." + this.region + ".amazonaws.com/");
70-
AWSSessionCredentials cred = provider.getCredentials();
71-
try {
72-
AWS4STSSigner signer = new AWS4STSSigner(
73-
uri.toURL(),
74-
"GET",
75-
"sts",
76-
this.region);
77-
String token = "k8s-aws-v1." + Base64.getEncoder().withoutPadding().encodeToString(signer.computeSignature(
78-
uri,
79-
new HashMap<String, String>() {{
80-
put("x-k8s-aws-id", clusterName);
81-
82-
}},
83-
new HashMap<String, String>() {{
84-
put("Action", "GetCallerIdentity");
85-
put("Version", "2011-06-15");
86-
}},
87-
expirySeconds,
88-
AWS4SignerBase.EMPTY_BODY_SHA256,
89-
cred.getAWSAccessKeyId(),
90-
cred.getAWSSecretKey(),
91-
cred.getSessionToken()).getBytes());
92-
client.setApiKeyPrefix("Bearer");
93-
client.setApiKey(token);
94-
log.info("Generated BEARER token for ApiClient, expiring at {}", Instant.now().plus(expirySeconds, ChronoUnit.SECONDS));
95-
} catch (MalformedURLException | URISyntaxException e) {
96-
throw new RuntimeException(e);
97-
}
73+
DefaultRequest<GetCallerIdentityRequest> defaultRequest =
74+
new DefaultRequest<>(new GetCallerIdentityRequest(), "sts");
75+
defaultRequest.setResourcePath("/");
76+
defaultRequest.setEndpoint(stsEndpoint);
77+
defaultRequest.setHttpMethod(HttpMethodName.GET);
78+
defaultRequest.addParameter("Action", "GetCallerIdentity");
79+
defaultRequest.addParameter("Version", "2011-06-15");
80+
defaultRequest.addHeader("x-k8s-aws-id", clusterName);
81+
AWS4Signer signer = new AWS4Signer();
82+
Date expirationTime = new Date(Clock.systemDefaultZone().millis() + 60 * 1000);
83+
signer.setServiceName("sts");
84+
signer.presignRequest(
85+
defaultRequest,
86+
this.provider.getCredentials(),
87+
expirationTime);
88+
String encodedUrl =
89+
Base64.getUrlEncoder()
90+
.withoutPadding()
91+
.encodeToString( RuntimeHttpUtils.convertRequestToUrl(
92+
defaultRequest, true, false).toString()
93+
.getBytes(StandardCharsets.UTF_8));
94+
String token = "k8s-aws-v1." + encodedUrl;
95+
client.setApiKeyPrefix("Bearer");
96+
client.setApiKey(token);
97+
log.info("Generated BEARER token for ApiClient, expiring at {}", Instant.now().plus(expirySeconds, ChronoUnit.SECONDS));
9898
}
9999
}

util/src/main/java/io/kubernetes/client/util/eks/AWS4STSSigner.java

-141
This file was deleted.

0 commit comments

Comments
 (0)