@@ -384,6 +384,7 @@ def test_do_2nd_refresh_access_token(self):
384384 grant = self .endpoint_context .authz (session_id , areq )
385385 code = self ._mint_code (grant , areq ["client_id" ])
386386
387+ self .token_endpoint .revoke_refresh_on_issue = False
387388 _cntx = self .endpoint_context
388389
389390 _token_request = TOKEN_REQ_DICT .copy ()
@@ -409,8 +410,7 @@ def test_do_2nd_refresh_access_token(self):
409410 _2nd_request = REFRESH_TOKEN_REQ .copy ()
410411 _2nd_request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
411412 _2nd_req = self .token_endpoint .parse_request (_request .to_json ())
412- _2nd_resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
413-
413+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
414414 assert set (_2nd_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
415415 assert set (_2nd_resp ["response_args" ].keys ()) == {
416416 "access_token" ,
@@ -461,6 +461,82 @@ def test_new_refresh_token(self, conf):
461461
462462 assert first_refresh_token != second_refresh_token
463463
464+ def test_revoke_on_issue_refresh_token (self , conf ):
465+ self .endpoint_context .cdb ["client_1" ] = {
466+ "client_secret" : "hemligt" ,
467+ "redirect_uris" : [("https://example.com/cb" , None )],
468+ "client_salt" : "salted" ,
469+ "endpoint_auth_method" : "client_secret_post" ,
470+ "response_types" : ["code" , "token" , "code id_token" , "id_token" ],
471+ }
472+
473+ self .token_endpoint .revoke_refresh_on_issue = True
474+ areq = AUTH_REQ .copy ()
475+ areq ["scope" ] = ["email" ]
476+
477+ session_id = self ._create_session (areq )
478+ grant = self .endpoint_context .authz (session_id , areq )
479+ code = self ._mint_code (grant , areq ["client_id" ])
480+
481+ _token_request = TOKEN_REQ_DICT .copy ()
482+ _token_request ["code" ] = code .value
483+ _req = self .token_endpoint .parse_request (_token_request )
484+ _resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
485+ assert "refresh_token" in _resp ["response_args" ]
486+ first_refresh_token = _resp ["response_args" ]["refresh_token" ]
487+
488+ _refresh_request = REFRESH_TOKEN_REQ .copy ()
489+ _refresh_request ["refresh_token" ] = first_refresh_token
490+ _2nd_req = self .token_endpoint .parse_request (_refresh_request .to_json ())
491+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
492+ assert "refresh_token" in _2nd_resp ["response_args" ]
493+ second_refresh_token = _2nd_resp ["response_args" ]["refresh_token" ]
494+
495+ assert first_refresh_token != second_refresh_token
496+ first_refresh_token = grant .get_token (first_refresh_token )
497+ second_refresh_token = grant .get_token (second_refresh_token )
498+ assert first_refresh_token .revoked is True
499+ assert second_refresh_token .revoked is False
500+
501+ def test_revoke_on_issue_refresh_token_per_client (self , conf ):
502+ self .endpoint_context .cdb ["client_1" ] = {
503+ "client_secret" : "hemligt" ,
504+ "redirect_uris" : [("https://example.com/cb" , None )],
505+ "client_salt" : "salted" ,
506+ "endpoint_auth_method" : "client_secret_post" ,
507+ "response_types" : ["code" , "token" , "code id_token" , "id_token" ],
508+ }
509+ self .endpoint_context .cdb [AUTH_REQ ["client_id" ]]["revoke_refresh_on_issue" ] = True
510+ areq = AUTH_REQ .copy ()
511+ areq ["scope" ] = ["openid" , "offline_access" ]
512+
513+ session_id = self ._create_session (areq )
514+ grant = self .endpoint_context .authz (session_id , areq )
515+ code = self ._mint_code (grant , areq ["client_id" ])
516+
517+ _token_request = TOKEN_REQ_DICT .copy ()
518+ _token_request ["code" ] = code .value
519+ _req = self .token_endpoint .parse_request (_token_request )
520+ _resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
521+ assert "refresh_token" in _resp ["response_args" ]
522+ first_refresh_token = _resp ["response_args" ]["refresh_token" ]
523+
524+ _refresh_request = REFRESH_TOKEN_REQ .copy ()
525+ _refresh_request ["refresh_token" ] = first_refresh_token
526+ _2nd_req = self .token_endpoint .parse_request (_refresh_request .to_json ())
527+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
528+ assert "refresh_token" in _2nd_resp ["response_args" ]
529+ second_refresh_token = _2nd_resp ["response_args" ]["refresh_token" ]
530+
531+ _2d_refresh_request = REFRESH_TOKEN_REQ .copy ()
532+ _2d_refresh_request ["refresh_token" ] = second_refresh_token
533+
534+ assert first_refresh_token != second_refresh_token
535+ first_refresh_token = grant .get_token (first_refresh_token )
536+ second_refresh_token = grant .get_token (second_refresh_token )
537+ assert first_refresh_token .revoked is True
538+ assert second_refresh_token .revoked is False
539+
464540 def test_refresh_scopes (self ):
465541 areq = AUTH_REQ .copy ()
466542 areq ["scope" ] = ["email" , "profile" ]
@@ -681,4 +757,4 @@ def test_refresh_token_request_other_client(self):
681757 assert isinstance (_resp , TokenErrorResponse )
682758 assert _resp .to_dict () == {
683759 "error" : "invalid_grant" , "error_description" : "Wrong client"
684- }
760+ }
0 commit comments