@@ -302,7 +302,7 @@ def test_process_request_using_private_key_jwt(self):
302302
303303 def test_do_refresh_access_token (self ):
304304 areq = AUTH_REQ .copy ()
305- areq ["scope" ] = ["openid" ]
305+ areq ["scope" ] = ["openid" , "offline_access" ]
306306
307307 session_id = self ._create_session (areq )
308308 grant = self .endpoint_context .authz (session_id , areq )
@@ -361,7 +361,6 @@ def test_do_2nd_refresh_access_token(self):
361361 _token .usage_rules ["supports_minting" ] = [
362362 "access_token" ,
363363 "refresh_token" ,
364- "id_token" ,
365364 ]
366365
367366 _req = self .token_endpoint .parse_request (_request .to_json ())
@@ -422,6 +421,180 @@ def test_new_refresh_token(self, conf):
422421
423422 assert first_refresh_token != second_refresh_token
424423
424+ def test_refresh_scopes (self ):
425+ areq = AUTH_REQ .copy ()
426+ areq ["scope" ] = ["openid" , "offline_access" , "profile" ]
427+
428+ session_id = self ._create_session (areq )
429+ grant = self .endpoint_context .authz (session_id , areq )
430+ code = self ._mint_code (grant , areq ["client_id" ])
431+
432+ _token_request = TOKEN_REQ_DICT .copy ()
433+ _token_request ["code" ] = code .value
434+ _req = self .token_endpoint .parse_request (_token_request )
435+ _resp = self .token_endpoint .process_request (request = _req )
436+
437+ _request = REFRESH_TOKEN_REQ .copy ()
438+ _request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
439+ _request ["scope" ] = ["openid" , "offline_access" ]
440+
441+ _req = self .token_endpoint .parse_request (_request .to_json ())
442+ _resp = self .token_endpoint .process_request (request = _req )
443+ assert set (_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
444+ assert set (_resp ["response_args" ].keys ()) == {
445+ "access_token" ,
446+ "token_type" ,
447+ "expires_in" ,
448+ "refresh_token" ,
449+ "scope" ,
450+ }
451+
452+ _token_value = _resp ["response_args" ]["access_token" ]
453+ _session_info = self .session_manager .get_session_info_by_token (_token_value )
454+ at = self .session_manager .find_token (
455+ _session_info ["session_id" ], _token_value
456+ )
457+ rt = self .session_manager .find_token (
458+ _session_info ["session_id" ], _resp ["response_args" ]["refresh_token" ]
459+ )
460+
461+ assert at .scope == rt .scope == _request ["scope" ]
462+
463+ def test_refresh_more_scopes (self ):
464+ areq = AUTH_REQ .copy ()
465+ areq ["scope" ] = ["openid" , "offline_access" ]
466+
467+ session_id = self ._create_session (areq )
468+ grant = self .endpoint_context .authz (session_id , areq )
469+ code = self ._mint_code (grant , areq ["client_id" ])
470+
471+ _token_request = TOKEN_REQ_DICT .copy ()
472+ _token_request ["code" ] = code .value
473+ _req = self .token_endpoint .parse_request (_token_request )
474+ _resp = self .token_endpoint .process_request (request = _req )
475+
476+ _request = REFRESH_TOKEN_REQ .copy ()
477+ _request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
478+ _request ["scope" ] = ["openid" , "offline_access" , "profile" ]
479+
480+ _req = self .token_endpoint .parse_request (_request .to_json ())
481+ assert isinstance (_req , TokenErrorResponse )
482+ _resp = self .token_endpoint .process_request (request = _req )
483+
484+ assert _resp .to_dict () == {
485+ "error" : "invalid_request" ,
486+ "error_description" : "Invalid refresh scopes"
487+ }
488+
489+ def test_refresh_more_scopes_2 (self ):
490+ areq = AUTH_REQ .copy ()
491+ areq ["scope" ] = ["openid" , "offline_access" , "profile" ]
492+
493+ session_id = self ._create_session (areq )
494+ grant = self .endpoint_context .authz (session_id , areq )
495+ code = self ._mint_code (grant , areq ["client_id" ])
496+
497+ _token_request = TOKEN_REQ_DICT .copy ()
498+ _token_request ["code" ] = code .value
499+ _req = self .token_endpoint .parse_request (_token_request )
500+ _resp = self .token_endpoint .process_request (request = _req )
501+
502+ _request = REFRESH_TOKEN_REQ .copy ()
503+ _request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
504+ _request ["scope" ] = ["openid" , "offline_access" ]
505+
506+ _token_value = _resp ["response_args" ]["refresh_token" ]
507+
508+ _req = self .token_endpoint .parse_request (_request .to_json ())
509+ _resp = self .token_endpoint .process_request (request = _req )
510+
511+ _token_value = _resp ["response_args" ]["refresh_token" ]
512+ _request ["refresh_token" ] = _token_value
513+ # We should be able to request the original requests scopes
514+ _request ["scope" ] = ["openid" , "offline_access" , "profile" ]
515+
516+ _req = self .token_endpoint .parse_request (_request .to_json ())
517+ _resp = self .token_endpoint .process_request (request = _req )
518+
519+ assert set (_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
520+ assert set (_resp ["response_args" ].keys ()) == {
521+ "access_token" ,
522+ "token_type" ,
523+ "expires_in" ,
524+ "refresh_token" ,
525+ "scope" ,
526+ }
527+
528+ _token_value = _resp ["response_args" ]["access_token" ]
529+ _session_info = self .session_manager .get_session_info_by_token (_token_value )
530+ at = self .session_manager .find_token (
531+ _session_info ["session_id" ], _token_value
532+ )
533+ rt = self .session_manager .find_token (
534+ _session_info ["session_id" ], _resp ["response_args" ]["refresh_token" ]
535+ )
536+
537+ assert at .scope == rt .scope == _request ["scope" ]
538+
539+ def test_refresh_no_openid_scope (self ):
540+ areq = AUTH_REQ .copy ()
541+ areq ["scope" ] = ["openid" , "offline_access" ]
542+
543+ session_id = self ._create_session (areq )
544+ grant = self .endpoint_context .authz (session_id , areq )
545+ code = self ._mint_code (grant , areq ["client_id" ])
546+
547+ _token_request = TOKEN_REQ_DICT .copy ()
548+ _token_request ["code" ] = code .value
549+ _req = self .token_endpoint .parse_request (_token_request )
550+ _resp = self .token_endpoint .process_request (request = _req )
551+
552+ _request = REFRESH_TOKEN_REQ .copy ()
553+ _request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
554+ _request ["scope" ] = ["offline_access" ]
555+
556+ _token_value = _resp ["response_args" ]["refresh_token" ]
557+
558+ _req = self .token_endpoint .parse_request (_request .to_json ())
559+ _resp = self .token_endpoint .process_request (request = _req )
560+
561+ assert set (_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
562+ assert set (_resp ["response_args" ].keys ()) == {
563+ "access_token" ,
564+ "token_type" ,
565+ "expires_in" ,
566+ "refresh_token" ,
567+ "scope" ,
568+ }
569+
570+ def test_refresh_no_offline_access_scope (self ):
571+ areq = AUTH_REQ .copy ()
572+ areq ["scope" ] = ["openid" , "offline_access" ]
573+
574+ session_id = self ._create_session (areq )
575+ grant = self .endpoint_context .authz (session_id , areq )
576+ code = self ._mint_code (grant , areq ["client_id" ])
577+
578+ _token_request = TOKEN_REQ_DICT .copy ()
579+ _token_request ["code" ] = code .value
580+ _req = self .token_endpoint .parse_request (_token_request )
581+ _resp = self .token_endpoint .process_request (request = _req )
582+
583+ _request = REFRESH_TOKEN_REQ .copy ()
584+ _request ["refresh_token" ] = _resp ["response_args" ]["refresh_token" ]
585+ _request ["scope" ] = ["openid" ]
586+
587+ _req = self .token_endpoint .parse_request (_request .to_json ())
588+ _resp = self .token_endpoint .process_request (request = _req )
589+
590+ assert set (_resp .keys ()) == {"cookie" , "response_args" , "http_headers" }
591+ assert set (_resp ["response_args" ].keys ()) == {
592+ "access_token" ,
593+ "token_type" ,
594+ "expires_in" ,
595+ "scope" ,
596+ }
597+
425598 def test_do_refresh_access_token_not_allowed (self ):
426599 areq = AUTH_REQ .copy ()
427600 areq ["scope" ] = ["openid" , "offline_access" ]
0 commit comments