@@ -398,6 +398,7 @@ def test_do_2nd_refresh_access_token(self):
398398 grant = self .endpoint_context .authz (session_id , areq )
399399 code = self ._mint_code (grant , areq ["client_id" ])
400400
401+ self .token_endpoint .revoke_refresh_on_issue = False
401402 _cntx = self .endpoint_context
402403
403404 _token_request = TOKEN_REQ_DICT .copy ()
@@ -423,8 +424,7 @@ def test_do_2nd_refresh_access_token(self):
423424 _2nd_request = REFRESH_TOKEN_REQ .copy ()
424425 _2nd_request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
425426 _2nd_req = self .token_endpoint .parse_request (_request .to_json ())
426- _2nd_resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
427-
427+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
428428 assert set (_2nd_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
429429 assert set (_2nd_resp ["response_args" ].keys ()) == {
430430 "access_token" ,
@@ -475,6 +475,82 @@ def test_new_refresh_token(self, conf):
475475
476476 assert first_refresh_token != second_refresh_token
477477
478+ def test_revoke_on_issue_refresh_token (self , conf ):
479+ self .endpoint_context .cdb ["client_1" ] = {
480+ "client_secret" : "hemligt" ,
481+ "redirect_uris" : [("https://example.com/cb" , None )],
482+ "client_salt" : "salted" ,
483+ "endpoint_auth_method" : "client_secret_post" ,
484+ "response_types" : ["code" , "token" , "code id_token" , "id_token" ],
485+ }
486+
487+ self .token_endpoint .revoke_refresh_on_issue = True
488+ areq = AUTH_REQ .copy ()
489+ areq ["scope" ] = ["email" ]
490+
491+ session_id = self ._create_session (areq )
492+ grant = self .endpoint_context .authz (session_id , areq )
493+ code = self ._mint_code (grant , areq ["client_id" ])
494+
495+ _token_request = TOKEN_REQ_DICT .copy ()
496+ _token_request ["code" ] = code .value
497+ _req = self .token_endpoint .parse_request (_token_request )
498+ _resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
499+ assert "refresh_token" in _resp ["response_args" ]
500+ first_refresh_token = _resp ["response_args" ]["refresh_token" ]
501+
502+ _refresh_request = REFRESH_TOKEN_REQ .copy ()
503+ _refresh_request ["refresh_token" ] = first_refresh_token
504+ _2nd_req = self .token_endpoint .parse_request (_refresh_request .to_json ())
505+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
506+ assert "refresh_token" in _2nd_resp ["response_args" ]
507+ second_refresh_token = _2nd_resp ["response_args" ]["refresh_token" ]
508+
509+ assert first_refresh_token != second_refresh_token
510+ first_refresh_token = grant .get_token (first_refresh_token )
511+ second_refresh_token = grant .get_token (second_refresh_token )
512+ assert first_refresh_token .revoked is True
513+ assert second_refresh_token .revoked is False
514+
515+ def test_revoke_on_issue_refresh_token_per_client (self , conf ):
516+ self .endpoint_context .cdb ["client_1" ] = {
517+ "client_secret" : "hemligt" ,
518+ "redirect_uris" : [("https://example.com/cb" , None )],
519+ "client_salt" : "salted" ,
520+ "endpoint_auth_method" : "client_secret_post" ,
521+ "response_types" : ["code" , "token" , "code id_token" , "id_token" ],
522+ }
523+ self .endpoint_context .cdb [AUTH_REQ ["client_id" ]]["revoke_refresh_on_issue" ] = True
524+ areq = AUTH_REQ .copy ()
525+ areq ["scope" ] = ["openid" , "offline_access" ]
526+
527+ session_id = self ._create_session (areq )
528+ grant = self .endpoint_context .authz (session_id , areq )
529+ code = self ._mint_code (grant , areq ["client_id" ])
530+
531+ _token_request = TOKEN_REQ_DICT .copy ()
532+ _token_request ["code" ] = code .value
533+ _req = self .token_endpoint .parse_request (_token_request )
534+ _resp = self .token_endpoint .process_request (request = _req , issue_refresh = True )
535+ assert "refresh_token" in _resp ["response_args" ]
536+ first_refresh_token = _resp ["response_args" ]["refresh_token" ]
537+
538+ _refresh_request = REFRESH_TOKEN_REQ .copy ()
539+ _refresh_request ["refresh_token" ] = first_refresh_token
540+ _2nd_req = self .token_endpoint .parse_request (_refresh_request .to_json ())
541+ _2nd_resp = self .token_endpoint .process_request (request = _2nd_req , issue_refresh = True )
542+ assert "refresh_token" in _2nd_resp ["response_args" ]
543+ second_refresh_token = _2nd_resp ["response_args" ]["refresh_token" ]
544+
545+ _2d_refresh_request = REFRESH_TOKEN_REQ .copy ()
546+ _2d_refresh_request ["refresh_token" ] = second_refresh_token
547+
548+ assert first_refresh_token != second_refresh_token
549+ first_refresh_token = grant .get_token (first_refresh_token )
550+ second_refresh_token = grant .get_token (second_refresh_token )
551+ assert first_refresh_token .revoked is True
552+ assert second_refresh_token .revoked is False
553+
478554 def test_refresh_scopes (self ):
479555 areq = AUTH_REQ .copy ()
480556 areq ["scope" ] = ["email" , "profile" ]
@@ -695,4 +771,4 @@ def test_refresh_token_request_other_client(self):
695771 assert isinstance (_resp , TokenErrorResponse )
696772 assert _resp .to_dict () == {
697773 "error" : "invalid_grant" , "error_description" : "Wrong client"
698- }
774+ }
0 commit comments