45
45
46
46
class Provider (object ):
47
47
def __init__ (self , signing_key , configuration_information , authz_state , clients , userinfo , * ,
48
- id_token_lifetime = 3600 ):
48
+ id_token_lifetime = 3600 , extra_scopes = None ):
49
49
# type: (jwkest.jwk.Key, Dict[str, Union[str, Sequence[str]]], se_leg_op.authz_state.AuthorizationState,
50
50
# Mapping[str, Mapping[str, Any]], se_leg_op.userinfo.Userinfo, int) -> None
51
51
"""
@@ -68,6 +68,12 @@ def __init__(self, signing_key, configuration_information, authz_state, clients,
68
68
self .configuration_information ['scopes_supported' ] = ['openid' ]
69
69
if 'response_types_supported' not in configuration_information :
70
70
self .configuration_information ['response_types_supported' ] = ['code' , 'id_token' , 'token id_token' ]
71
+
72
+ self .extra_scopes = {} if extra_scopes is None else extra_scopes
73
+ _scopes = self .configuration_information ['scopes_supported' ]
74
+ _scopes .extend (self .extra_scopes .keys ())
75
+ self .configuration_information ['scopes_supported' ] = list (set (_scopes ))
76
+
71
77
self .configuration_information .verify ()
72
78
73
79
self .authz_state = authz_state
@@ -166,7 +172,11 @@ def authorize(self, authentication_request, # type: oic.oic.message.Authorizati
166
172
if len (authentication_request ['response_type' ]) == 1 :
167
173
# only id token is issued -> no way of doing userinfo request, so include all claims in ID Token,
168
174
# even those requested by the scope parameter
169
- requested_claims .update (scope2claims (authentication_request ['scope' ]))
175
+ requested_claims .update (
176
+ scope2claims (
177
+ authentication_request ['scope' ], extra_scope_dict = self .extra_scopes
178
+ )
179
+ )
170
180
171
181
user_claims = self .userinfo .get_claims_for (user_id , requested_claims )
172
182
response ['id_token' ] = self ._create_signed_id_token (authentication_request ['client_id' ], sub ,
@@ -340,7 +350,7 @@ def _do_code_exchange(self, request, # type: Dict[str, str]
340
350
raise InvalidTokenRequest (str (e ), token_request ) from e
341
351
342
352
authentication_request = self .authz_state .get_authorization_request_for_code (token_request ['code' ])
343
-
353
+
344
354
if token_request ['client_id' ] != authentication_request ['client_id' ]:
345
355
logger .info ('Authorization code \' %s\' belonging to \' %s\' was used by \' %s\' ' ,
346
356
token_request ['code' ], authentication_request ['client_id' ], token_request ['client_id' ])
@@ -430,10 +440,10 @@ def handle_userinfo_request(self, request=None, http_headers=None):
430
440
introspection = self .authz_state .introspect_access_token (bearer_token )
431
441
if not introspection ['active' ]:
432
442
raise InvalidAccessToken ('The access token has expired' )
433
- scope = introspection ['scope' ]
443
+ scopes = introspection ['scope' ]. split ()
434
444
user_id = self .authz_state .get_user_id_for_subject_identifier (introspection ['sub' ])
435
445
436
- requested_claims = scope2claims (scope . split () )
446
+ requested_claims = scope2claims (scopes , extra_scope_dict = self . extra_scopes )
437
447
authentication_request = self .authz_state .get_authorization_request_for_access_token (bearer_token )
438
448
requested_claims .update (self ._get_requested_claims_in (authentication_request , 'userinfo' ))
439
449
user_claims = self .userinfo .get_claims_for (user_id , requested_claims )
0 commit comments