@@ -36,6 +36,8 @@ all() ->
3636 , {group , application_env }
3737 , {group , ecs }
3838 , {group , eks }
39+ , {group , web_identity }
40+ , {group , web_identity_default_session_name }
3941 , {group , credential_process }
4042 ].
4143
@@ -50,6 +52,8 @@ groups() ->
5052 , {application_env , [], all_testcases ()}
5153 , {ecs , [], all_testcases ()}
5254 , {eks , [], all_testcases ()}
55+ , {web_identity , [], all_testcases ()}
56+ , {web_identity_default_session_name , [], all_testcases ()}
5357 , {credential_process , [], all_testcases ()}
5458 ].
5559
@@ -75,6 +79,8 @@ init_per_group(GroupName, Config) ->
7579 application_env -> init_group (application_env , provider (env ), application_env , Config );
7680 credential_process ->
7781 init_group (credential_process , provider (file ), credential_process , Config );
82+ web_identity_default_session_name = GroupName ->
83+ init_group (GroupName , provider (web_identity ), GroupName , Config );
7884 GroupName -> init_group (GroupName , Config )
7985 end .
8086
@@ -123,6 +129,12 @@ assert_test(credential_process) ->
123129assert_test (eks ) ->
124130 Provider = provider (eks ),
125131 assert_values (? DUMMY_ACCESS_KEY , ? DUMMY_SECRET_ACCESS_KEY , Provider );
132+ assert_test (WebIdentity ) when WebIdentity =:= web_identity ;
133+ WebIdentity =:= web_identity_default_session_name ->
134+ Provider = provider (web_identity ),
135+ assert_values (? DUMMY_ACCESS_KEY , ? DUMMY_SECRET_ACCESS_KEY , Provider ),
136+ #{token := Token } = aws_credentials :get_credentials (),
137+ ? assertEqual (<<" unused" >>, Token );
126138assert_test (GroupName ) ->
127139 Provider = provider (GroupName ),
128140 assert_values (? DUMMY_ACCESS_KEY , ? DUMMY_SECRET_ACCESS_KEY , Provider ).
@@ -159,6 +171,8 @@ provider_opts(credential_env, _Config) ->
159171 #{credential_path => os :getenv (" HOME" )};
160172provider_opts (credential_process , Config ) ->
161173 #{credential_path => ? config (data_dir , Config ) ++ " credential_process/" };
174+ provider_opts (web_identity , _Config ) ->
175+ #{role_session_name => " overridden" };
162176provider_opts (_GroupName , _Config ) ->
163177 #{}.
164178
@@ -213,6 +227,28 @@ setup_provider(eks, Config) ->
213227 , {" AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE" , OldTokenFile }
214228 ]
215229 };
230+ setup_provider (web_identity_default_session_name , Config ) ->
231+ OldRoleArn = os :getenv (" AWS_ROLE_ARN" ),
232+ OldWebIdentityTokenFile = os :getenv (" AWS_WEB_IDENTITY_TOKEN_FILE" ),
233+ os :putenv (" AWS_ROLE_ARN" , " arg:aws:iam::123123123" ),
234+ os :putenv (" AWS_WEB_IDENTITY_TOKEN_FILE" , ? config (data_dir , Config ) ++ " web_identity/token" ),
235+ meck :new (httpc , [no_link , passthrough ]),
236+ meck :expect (httpc , request , fun mock_httpc_request_web_identity_default_session_name /5 ),
237+ #{ mocks => [httpc ]
238+ , env => [ {" AWS_ROLE_ARN" , OldRoleArn }
239+ , {" AWS_WEB_IDENTITY_TOKEN_FILE" , OldWebIdentityTokenFile }
240+ ]};
241+ setup_provider (web_identity , Config ) ->
242+ OldRoleArn = os :getenv (" AWS_ROLE_ARN" ),
243+ OldWebIdentityTokenFile = os :getenv (" AWS_WEB_IDENTITY_TOKEN_FILE" ),
244+ os :putenv (" AWS_ROLE_ARN" , " arg:aws:iam::123123123" ),
245+ os :putenv (" AWS_WEB_IDENTITY_TOKEN_FILE" , ? config (data_dir , Config ) ++ " web_identity/token" ),
246+ meck :new (httpc , [no_link , passthrough ]),
247+ meck :expect (httpc , request , fun mock_httpc_request_web_identity /5 ),
248+ #{ mocks => [httpc ]
249+ , env => [ {" AWS_ROLE_ARN" , OldRoleArn }
250+ , {" AWS_WEB_IDENTITY_TOKEN_FILE" , OldWebIdentityTokenFile }
251+ ]};
216252setup_provider (config_env , Config ) ->
217253 Old = os :getenv (" AWS_CONFIG_FILE" ),
218254 os :putenv (" AWS_CONFIG_FILE" , ? config (data_dir , Config ) ++ " env/config" ),
@@ -283,6 +319,31 @@ mock_httpc_request_eks(Method, Request, HTTPOptions, Options, Profile) ->
283319 meck :passthrough ([Method , Request , HTTPOptions , Options , Profile ])
284320 end .
285321
322+ mock_httpc_request_web_identity_default_session_name (
323+ Method , Request , HTTPOptions , Options , Profile ) ->
324+ case Request of
325+ {" https://sts.amazonaws.com/" ++
326+ " ?Action=AssumeRoleWithWebIdentity&Version=2011-06-15" ++
327+ " &RoleArn=arg:aws:iam::123123123" ++
328+ " &WebIdentityToken=dummy-web-identity-token" ++
329+ " &RoleSessionName=erlang_aws_credentials" , []} ->
330+ {ok , response ('web-identity-credentials' )};
331+ _ ->
332+ meck :passthrough ([Method , Request , HTTPOptions , Options , Profile ])
333+ end .
334+
335+ mock_httpc_request_web_identity (Method , Request , HTTPOptions , Options , Profile ) ->
336+ case Request of
337+ {" https://sts.amazonaws.com/" ++
338+ " ?Action=AssumeRoleWithWebIdentity&Version=2011-06-15" ++
339+ " &RoleArn=arg:aws:iam::123123123" ++
340+ " &WebIdentityToken=dummy-web-identity-token" ++
341+ " &RoleSessionName=overridden" , []} ->
342+ {ok , response ('web-identity-credentials' )};
343+ _ ->
344+ meck :passthrough ([Method , Request , HTTPOptions , Options , Profile ])
345+ end .
346+
286347response (BodyTag ) ->
287348 StatusLine = {unused , 200 , unused },
288349 Headers = [],
@@ -296,23 +357,34 @@ body('security-credentials') ->
296357body ('dummy-role' ) ->
297358 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
298359 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
299- , 'Expiration' => <<" 2025 -09-25T23:43:56Z" >>
360+ , 'Expiration' => <<" 2026 -09-25T23:43:56Z" >>
300361 , 'Token' => unused
301362 });
302363body ('document' ) ->
303364 jsx :encode (#{ 'region' => unused });
304365body ('dummy-uri' ) ->
305366 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
306367 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
307- , 'Expiration' => <<" 2025 -09-25T23:43:56Z" >>
368+ , 'Expiration' => <<" 2026 -09-25T23:43:56Z" >>
308369 , 'Token' => unused
309370 });
310371body ('eks-credentials' ) ->
311372 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
312373 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
313- , 'Expiration' => <<" 2025 -09-25T23:43:56Z" >>
374+ , 'Expiration' => <<" 2026 -09-25T23:43:56Z" >>
314375 , 'Token' => unused
315- }).
376+ });
377+ body ('web-identity-credentials' ) ->
378+ <<" <AssumeRoleWithWebIdentityResponse>
379+ <AssumeRoleWithWebIdentityResult>
380+ <Credentials>
381+ <AccessKeyId>" , ? DUMMY_ACCESS_KEY /binary , " </AccessKeyId>
382+ <SecretAccessKey>" , ? DUMMY_SECRET_ACCESS_KEY /binary , " </SecretAccessKey>
383+ <SessionToken>unused</SessionToken>
384+ <Expiration>2026-09-25T23:43:56Z</Expiration>
385+ </Credentials>
386+ </AssumeRoleWithWebIdentityResult>
387+ </AssumeRoleWithWebIdentityResponse>" >>.
316388
317389maybe_put_env (Key , false ) ->
318390 os :unsetenv (Key );
0 commit comments