@@ -52,7 +52,8 @@ groups() ->
5252
5353 {token_refresh , [], [
5454 test_failed_token_refresh_case1 ,
55- test_failed_token_refresh_case2
55+ test_failed_token_refresh_case2 ,
56+ refreshed_token_cannot_change_username
5657 ]},
5758
5859 {extra_scopes_source , [], [
@@ -323,21 +324,33 @@ preconfigure_node(Config) ->
323324
324325 rabbit_ct_helpers :set_config (Config , {fixture_jwk , Jwk }).
325326
327+ generate_valid_token_with_sub (Config , Sub ) ->
328+ generate_valid_token (Config ,
329+ ? UTIL_MOD :full_permission_scopes (), undefined , Sub ).
330+
326331generate_valid_token (Config ) ->
327332 generate_valid_token (Config , ? UTIL_MOD :full_permission_scopes ()).
328333
329334generate_valid_token (Config , Scopes ) ->
330- generate_valid_token (Config , Scopes , undefined ).
335+ generate_valid_token (Config , Scopes , undefined , undefined ).
331336
332337generate_valid_token (Config , Scopes , Audience ) ->
338+ generate_valid_token (Config , Scopes , Audience , undefined ).
339+
340+ generate_valid_token (Config , Scopes , Audience , Sub ) ->
333341 Jwk = case rabbit_ct_helpers :get_config (Config , fixture_jwk ) of
334342 undefined -> ? UTIL_MOD :fixture_jwk ();
335343 Value -> Value
336344 end ,
337- Token = case Audience of
345+ Token0 = case Audience of
338346 undefined -> ? UTIL_MOD :fixture_token_with_scopes (Scopes );
339- DefinedAudience -> maps :put (<<" aud" >>, DefinedAudience , ? UTIL_MOD :fixture_token_with_scopes (Scopes ))
347+ DefinedAudience -> maps :put (<<" aud" >>, DefinedAudience ,
348+ ? UTIL_MOD :fixture_token_with_scopes (Scopes ))
340349 end ,
350+ Token = case Sub of
351+ undefined -> Token0 ;
352+ _ -> maps :put (<<" sub" >>, Sub , Token0 )
353+ end ,
341354 ? UTIL_MOD :sign_token_hs (Token , Jwk ).
342355
343356generate_valid_token_with_extra_fields (Config , ExtraFields ) ->
@@ -913,6 +926,21 @@ test_failed_token_refresh_case1(Config) ->
913926
914927 close_connection (Conn ).
915928
929+ refreshed_token_cannot_change_username (Config ) ->
930+ {_ , Token } = generate_valid_token_with_sub (Config , <<" username" >>),
931+ ct :log (" Token: ~p " , [Token ]),
932+ Conn = open_unmanaged_connection (Config , 0 , <<" vhost4" >>, <<" username" >>, Token ),
933+ {_ , RefreshedToken } = generate_valid_token_with_sub (Config , <<" username2" >>),
934+ ct :log (" RefreshedToken: ~p " , [RefreshedToken ]),
935+
936+ % % the error is communicated asynchronously via a connection-level error
937+ Ret = amqp_connection :update_secret (Conn , RefreshedToken , <<" token refresh" >>),
938+ ct :log (" Ret: ~p " , [Ret ]),
939+ ? assertExit ({{shutdown , {server_initiated_close , 530 ,
940+ <<" NOT_ALLOWED - New secret was refused by one of the backends" >>}}, _ },
941+ close_connection (Conn )).
942+
943+
916944test_failed_token_refresh_case2 (Config ) ->
917945 {_Algo , Token } = generate_valid_token (Config , [<<" rabbitmq.configure:vhost4/*" >>,
918946 <<" rabbitmq.write:vhost4/*" >>,
0 commit comments