@@ -284,8 +284,6 @@ def test_token_exchange(self):
284
284
_resp = self .endpoint .process_request (request = _req )
285
285
286
286
_token_value = _resp ["response_args" ]["access_token" ]
287
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
288
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
289
287
290
288
token_exchange_req = TokenExchangeRequest (
291
289
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -319,16 +317,12 @@ def test_additional_parameters(self):
319
317
grant = self .endpoint_context .authz (session_id , areq )
320
318
code = self ._mint_code (grant , areq ['client_id' ])
321
319
322
- _cntx = self .endpoint_context
323
-
324
320
_token_request = TOKEN_REQ_DICT .copy ()
325
321
_token_request ["code" ] = code .value
326
322
_req = self .endpoint .parse_request (_token_request )
327
323
_resp = self .endpoint .process_request (request = _req )
328
324
329
325
_token_value = _resp ["response_args" ]["access_token" ]
330
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
331
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
332
326
333
327
token_exchange_req = TokenExchangeRequest (
334
328
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -368,16 +362,12 @@ def test_token_exchange_fails_if_disabled(self):
368
362
grant = self .endpoint_context .authz (session_id , areq )
369
363
code = self ._mint_code (grant , areq ['client_id' ])
370
364
371
- _cntx = self .endpoint_context
372
-
373
365
_token_request = TOKEN_REQ_DICT .copy ()
374
366
_token_request ["code" ] = code .value
375
367
_req = self .endpoint .parse_request (_token_request )
376
368
_resp = self .endpoint .process_request (request = _req )
377
369
378
370
_token_value = _resp ["response_args" ]["access_token" ]
379
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
380
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
381
371
382
372
token_exchange_req = TokenExchangeRequest (
383
373
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -414,15 +404,12 @@ def test_wrong_resource(self):
414
404
grant = self .endpoint_context .authz (session_id , areq )
415
405
code = self ._mint_code (grant , areq ['client_id' ])
416
406
417
- _cntx = self .endpoint_context
418
-
419
407
_token_request = TOKEN_REQ_DICT .copy ()
420
408
_token_request ["code" ] = code .value
421
409
_req = self .endpoint .parse_request (_token_request )
422
410
_resp = self .endpoint .process_request (request = _req )
423
411
424
412
_token_value = _resp ["response_args" ]["access_token" ]
425
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
426
413
427
414
token_exchange_req = TokenExchangeRequest (
428
415
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -444,6 +431,46 @@ def test_wrong_resource(self):
444
431
assert _resp ["error" ] == "invalid_target"
445
432
assert _resp ["error_description" ] == "Unknown resource"
446
433
434
+ def test_refresh_token_audience (self ):
435
+ """
436
+ Test that requesting a refresh token with audience fails.
437
+
438
+ We currently only allow audience that matches the owner of the subject_token or
439
+ the allowed audience as configured in authz/grant_config
440
+ """
441
+ areq = AUTH_REQ .copy ()
442
+
443
+ session_id = self ._create_session (areq )
444
+ grant = self .endpoint_context .authz (session_id , areq )
445
+ code = self ._mint_code (grant , areq ['client_id' ])
446
+
447
+ _token_request = TOKEN_REQ_DICT .copy ()
448
+ _token_request ["code" ] = code .value
449
+ _req = self .endpoint .parse_request (_token_request )
450
+ _resp = self .endpoint .process_request (request = _req )
451
+
452
+ _token_value = _resp ["response_args" ]["access_token" ]
453
+
454
+ token_exchange_req = TokenExchangeRequest (
455
+ grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
456
+ subject_token = _token_value ,
457
+ subject_token_type = "urn:ietf:params:oauth:token-type:refresh_token" ,
458
+ audience = ["https://example.com" ]
459
+ )
460
+
461
+ _req = self .endpoint .parse_request (
462
+ token_exchange_req .to_json (),
463
+ {
464
+ "headers" : {
465
+ "authorization" : "Basic {}" .format ("Y2xpZW50XzE6aGVtbGlndA==" )
466
+ }
467
+ },
468
+ )
469
+ _resp = self .endpoint .process_request (request = _req )
470
+ assert set (_resp .keys ()) == {"error" , "error_description" }
471
+ assert _resp ["error" ] == "invalid_target"
472
+ assert _resp ["error_description" ] == "Refresh token has single owner"
473
+
447
474
def test_wrong_audience (self ):
448
475
"""
449
476
Test that requesting a token for an unknown audience fails.
@@ -457,16 +484,12 @@ def test_wrong_audience(self):
457
484
grant = self .endpoint_context .authz (session_id , areq )
458
485
code = self ._mint_code (grant , areq ['client_id' ])
459
486
460
- _cntx = self .endpoint_context
461
-
462
487
_token_request = TOKEN_REQ_DICT .copy ()
463
488
_token_request ["code" ] = code .value
464
489
_req = self .endpoint .parse_request (_token_request )
465
490
_resp = self .endpoint .process_request (request = _req )
466
491
467
492
_token_value = _resp ["response_args" ]["access_token" ]
468
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
469
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
470
493
471
494
token_exchange_req = TokenExchangeRequest (
472
495
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -488,38 +511,75 @@ def test_wrong_audience(self):
488
511
assert _resp ["error" ] == "invalid_target"
489
512
assert _resp ["error_description" ] == "Unknown audience"
490
513
491
- @pytest .mark .parametrize ("aud" , [
492
- "https://example.com/" ,
493
- ])
494
- def test_exchanged_refresh_token_wrong_audience (self , aud ):
514
+ def test_exchange_refresh_token_to_refresh_token (self ):
495
515
"""
496
516
Test that requesting a token for an unknown audience fails.
497
517
498
518
We currently only allow audience that matches the owner of the subject_token or
499
519
the allowed audience as configured in authz/grant_config
500
520
"""
521
+ AUTH_REQ ["scope" ] = ["openid" , "offline_access" ]
501
522
areq = AUTH_REQ .copy ()
502
523
503
524
session_id = self ._create_session (areq )
504
525
grant = self .endpoint_context .authz (session_id , areq )
505
526
code = self ._mint_code (grant , areq ['client_id' ])
506
527
507
- _cntx = self .endpoint_context
528
+ _token_request = TOKEN_REQ_DICT .copy ()
529
+ _token_request ["scope" ] = "openid og"
530
+ _token_request ["code" ] = code .value
531
+ _req = self .endpoint .parse_request (_token_request )
532
+ _resp = self .endpoint .process_request (request = _req )
533
+ _token_value = _resp ["response_args" ]["refresh_token" ]
534
+
535
+ token_exchange_req = TokenExchangeRequest (
536
+ grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
537
+ subject_token = _token_value ,
538
+ subject_token_type = "urn:ietf:params:oauth:token-type:refresh_token" ,
539
+ requested_token_type = "urn:ietf:params:oauth:token-type:refresh_token"
540
+ )
541
+
542
+ _req = self .endpoint .parse_request (
543
+ token_exchange_req .to_json (),
544
+ {
545
+ "headers" : {
546
+ "authorization" : "Basic {}" .format ("Y2xpZW50XzE6aGVtbGlndA==" )
547
+ }
548
+ },
549
+ )
550
+ _resp = self .endpoint .process_request (request = _req )
551
+ assert set (_resp .keys ()) != {"error" , "error_description" }
552
+
553
+ @pytest .mark .parametrize ("scopes" , [
554
+ ["openid" , "offline_access" ],
555
+ ["openid" ],
556
+ ])
557
+ def test_exchange_access_token_to_refresh_token (self , scopes ):
558
+ """
559
+ Test that requesting a token for an unknown audience fails.
560
+
561
+ We currently only allow audience that matches the owner of the subject_token or
562
+ the allowed audience as configured in authz/grant_config
563
+ """
564
+ AUTH_REQ ["scope" ] = scopes
565
+ areq = AUTH_REQ .copy ()
566
+
567
+ session_id = self ._create_session (areq )
568
+ grant = self .endpoint_context .authz (session_id , areq )
569
+ code = self ._mint_code (grant , areq ['client_id' ])
508
570
509
571
_token_request = TOKEN_REQ_DICT .copy ()
572
+ _token_request ["scope" ] = "openid og"
510
573
_token_request ["code" ] = code .value
511
574
_req = self .endpoint .parse_request (_token_request )
512
575
_resp = self .endpoint .process_request (request = _req )
513
576
_token_value = _resp ["response_args" ]["access_token" ]
514
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
515
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
516
577
517
578
token_exchange_req = TokenExchangeRequest (
518
579
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
519
580
subject_token = _token_value ,
520
581
subject_token_type = "urn:ietf:params:oauth:token-type:access_token" ,
521
- requested_token_type = "urn:ietf:params:oauth:token-type:refresh_token" ,
522
- audience = aud
582
+ requested_token_type = "urn:ietf:params:oauth:token-type:refresh_token"
523
583
)
524
584
525
585
_req = self .endpoint .parse_request (
@@ -531,9 +591,11 @@ def test_exchanged_refresh_token_wrong_audience(self, aud):
531
591
},
532
592
)
533
593
_resp = self .endpoint .process_request (request = _req )
534
- assert set (_resp .keys ()) == {"error" , "error_description" }
535
- assert _resp ["error" ] == "invalid_request"
536
- assert _resp ["error_description" ] == "Exchange access token to refresh token forbbiden"
594
+ if ("offline_access" in scopes ):
595
+ assert set (_resp .keys ()) == {"error" , "error_description" }
596
+ else :
597
+ assert _resp ["error" ] == "invalid_request"
598
+ assert _resp ["error_description" ] == "Exchange access token to refresh token forbbiden"
537
599
538
600
@pytest .mark .parametrize ("missing_attribute" , [
539
601
"subject_token_type" ,
@@ -549,16 +611,12 @@ def test_missing_parameters(self, missing_attribute):
549
611
grant = self .endpoint_context .authz (session_id , areq )
550
612
code = self ._mint_code (grant , areq ['client_id' ])
551
613
552
- _cntx = self .endpoint_context
553
-
554
614
_token_request = TOKEN_REQ_DICT .copy ()
555
615
_token_request ["code" ] = code .value
556
616
_req = self .endpoint .parse_request (_token_request )
557
617
_resp = self .endpoint .process_request (request = _req )
558
618
559
619
_token_value = _resp ["response_args" ]["access_token" ]
560
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
561
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
562
620
563
621
token_exchange_req = TokenExchangeRequest (
564
622
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -602,15 +660,12 @@ def test_unsupported_requested_token_type(self, unsupported_type):
602
660
grant = self .endpoint_context .authz (session_id , areq )
603
661
code = self ._mint_code (grant , areq ['client_id' ])
604
662
605
- _cntx = self .endpoint_context
606
-
607
663
_token_request = TOKEN_REQ_DICT .copy ()
608
664
_token_request ["code" ] = code .value
609
665
_req = self .endpoint .parse_request (_token_request )
610
666
_resp = self .endpoint .process_request (request = _req )
611
667
612
668
_token_value = _resp ["response_args" ]["access_token" ]
613
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
614
669
615
670
token_exchange_req = TokenExchangeRequest (
616
671
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -653,16 +708,12 @@ def test_unsupported_subject_token_type(self, unsupported_type):
653
708
grant = self .endpoint_context .authz (session_id , areq )
654
709
code = self ._mint_code (grant , areq ['client_id' ])
655
710
656
- _cntx = self .endpoint_context
657
-
658
711
_token_request = TOKEN_REQ_DICT .copy ()
659
712
_token_request ["code" ] = code .value
660
713
_req = self .endpoint .parse_request (_token_request )
661
714
_resp = self .endpoint .process_request (request = _req )
662
715
663
716
_token_value = _resp ["response_args" ]["access_token" ]
664
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
665
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
666
717
667
718
token_exchange_req = TokenExchangeRequest (
668
719
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -698,16 +749,12 @@ def test_unsupported_actor_token(self):
698
749
grant = self .endpoint_context .authz (session_id , areq )
699
750
code = self ._mint_code (grant , areq ['client_id' ])
700
751
701
- _cntx = self .endpoint_context
702
-
703
752
_token_request = TOKEN_REQ_DICT .copy ()
704
753
_token_request ["code" ] = code .value
705
754
_req = self .endpoint .parse_request (_token_request )
706
755
_resp = self .endpoint .process_request (request = _req )
707
756
708
757
_token_value = _resp ["response_args" ]["access_token" ]
709
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
710
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
711
758
712
759
token_exchange_req = TokenExchangeRequest (
713
760
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
@@ -742,17 +789,11 @@ def test_invalid_token(self):
742
789
grant = self .endpoint_context .authz (session_id , areq )
743
790
code = self ._mint_code (grant , areq ['client_id' ])
744
791
745
- _cntx = self .endpoint_context
746
-
747
792
_token_request = TOKEN_REQ_DICT .copy ()
748
793
_token_request ["code" ] = code .value
749
794
_req = self .endpoint .parse_request (_token_request )
750
795
_resp = self .endpoint .process_request (request = _req )
751
796
752
- _token_value = _resp ["response_args" ]["access_token" ]
753
- _session_info = self .session_manager .get_session_info_by_token (_token_value )
754
- _token = self .session_manager .find_token (_session_info ["session_id" ], _token_value )
755
-
756
797
token_exchange_req = TokenExchangeRequest (
757
798
grant_type = "urn:ietf:params:oauth:grant-type:token-exchange" ,
758
799
subject_token = "invalid_token" ,
0 commit comments