@@ -108,9 +108,10 @@ private Credentials fetchCredentials(String tokenFile) {
108108 return credentials ;
109109 }
110110
111- private Credentials fetchCredentials (HttpUrl url ) {
112- try (Response response =
113- httpClient .newCall (new Request .Builder ().url (url ).method ("GET" , null ).build ()).execute ()) {
111+ private Credentials fetchCredentials (HttpUrl url , String tokenHeader , String token ) {
112+ Request .Builder builder = new Request .Builder ().url (url ).method ("GET" , null );
113+ if (token != null && !token .isEmpty ()) builder .header (tokenHeader , token );
114+ try (Response response = httpClient .newCall (builder .build ()).execute ()) {
114115 if (!response .isSuccessful ()) {
115116 throw new ProviderException (url + " failed with HTTP status code " + response .code ());
116117 }
@@ -126,10 +127,38 @@ private Credentials fetchCredentials(HttpUrl url) {
126127 }
127128 }
128129
129- private String getIamRoleName (HttpUrl url ) {
130+ private String fetchImdsToken () {
131+ HttpUrl url = this .customEndpoint ;
132+ if (url == null ) {
133+ url = HttpUrl .parse ("http://169.254.169.254/latest/api/token" );
134+ } else {
135+ url =
136+ new HttpUrl .Builder ()
137+ .scheme (url .scheme ())
138+ .host (url .host ())
139+ .addPathSegments ("latest/api/token" )
140+ .build ();
141+ }
142+ String token = "" ;
143+ Request request =
144+ new Request .Builder ()
145+ .url (url )
146+ .method ("PUT" , null )
147+ .header ("X-aws-ec2-metadata-token-ttl-seconds" , "21600" )
148+ .build ();
149+ try (Response response = httpClient .newCall (request ).execute ()) {
150+ if (response .isSuccessful ()) token = response .body ().string ();
151+ } catch (IOException e ) {
152+ token = "" ;
153+ }
154+ return token ;
155+ }
156+
157+ private String getIamRoleName (HttpUrl url , String token ) {
130158 String [] roleNames = null ;
131- try (Response response =
132- httpClient .newCall (new Request .Builder ().url (url ).method ("GET" , null ).build ()).execute ()) {
159+ Request .Builder builder = new Request .Builder ().url (url ).method ("GET" , null );
160+ if (token != null && !token .isEmpty ()) builder .header ("X-aws-ec2-metadata-token" , token );
161+ try (Response response = httpClient .newCall (builder .build ()).execute ()) {
133162 if (!response .isSuccessful ()) {
134163 throw new ProviderException (url + " failed with HTTP status code " + response .code ());
135164 }
@@ -146,7 +175,7 @@ private String getIamRoleName(HttpUrl url) {
146175 return roleNames [0 ];
147176 }
148177
149- private HttpUrl getIamRoleNamedUrl () {
178+ private HttpUrl getIamRoleNamedUrl (String token ) {
150179 HttpUrl url = this .customEndpoint ;
151180 if (url == null ) {
152181 url = HttpUrl .parse ("http://169.254.169.254/latest/meta-data/iam/security-credentials/" );
@@ -159,7 +188,7 @@ private HttpUrl getIamRoleNamedUrl() {
159188 .build ();
160189 }
161190
162- String roleName = getIamRoleName (url );
191+ String roleName = getIamRoleName (url , token );
163192 return url .newBuilder ().addPathSegment (roleName ).build ();
164193 }
165194
@@ -176,6 +205,8 @@ public synchronized Credentials fetch() {
176205 return credentials ;
177206 }
178207
208+ String tokenHeader = "Authorization" ;
209+ String token = getProperty ("AWS_CONTAINER_AUTHORIZATION_TOKEN" );
179210 if (getProperty ("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" ) != null ) {
180211 if (url == null ) {
181212 url =
@@ -191,10 +222,12 @@ public synchronized Credentials fetch() {
191222 }
192223 checkLoopbackHost (url );
193224 } else {
194- url = getIamRoleNamedUrl ();
225+ token = fetchImdsToken ();
226+ tokenHeader = "X-aws-ec2-metadata-token" ;
227+ url = getIamRoleNamedUrl (token );
195228 }
196229
197- credentials = fetchCredentials (url );
230+ credentials = fetchCredentials (url , tokenHeader , token );
198231 return credentials ;
199232 }
200233
0 commit comments