4545
4646class Provider (object ):
4747 def __init__ (self , signing_key , configuration_information , authz_state , clients , userinfo , * ,
48- id_token_lifetime = 3600 ):
48+ id_token_lifetime = 3600 , extra_scopes = None ):
4949 # type: (jwkest.jwk.Key, Dict[str, Union[str, Sequence[str]]], se_leg_op.authz_state.AuthorizationState,
5050 # Mapping[str, Mapping[str, Any]], se_leg_op.userinfo.Userinfo, int) -> None
5151 """
@@ -68,6 +68,12 @@ def __init__(self, signing_key, configuration_information, authz_state, clients,
6868 self .configuration_information ['scopes_supported' ] = ['openid' ]
6969 if 'response_types_supported' not in configuration_information :
7070 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+
7177 self .configuration_information .verify ()
7278
7379 self .authz_state = authz_state
@@ -166,7 +172,11 @@ def authorize(self, authentication_request, # type: oic.oic.message.Authorizati
166172 if len (authentication_request ['response_type' ]) == 1 :
167173 # only id token is issued -> no way of doing userinfo request, so include all claims in ID Token,
168174 # 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+ )
170180
171181 user_claims = self .userinfo .get_claims_for (user_id , requested_claims )
172182 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]
340350 raise InvalidTokenRequest (str (e ), token_request ) from e
341351
342352 authentication_request = self .authz_state .get_authorization_request_for_code (token_request ['code' ])
343-
353+
344354 if token_request ['client_id' ] != authentication_request ['client_id' ]:
345355 logger .info ('Authorization code \' %s\' belonging to \' %s\' was used by \' %s\' ' ,
346356 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):
430440 introspection = self .authz_state .introspect_access_token (bearer_token )
431441 if not introspection ['active' ]:
432442 raise InvalidAccessToken ('The access token has expired' )
433- scope = introspection ['scope' ]
443+ scopes = introspection ['scope' ]. split ()
434444 user_id = self .authz_state .get_user_id_for_subject_identifier (introspection ['sub' ])
435445
436- requested_claims = scope2claims (scope . split () )
446+ requested_claims = scope2claims (scopes , extra_scope_dict = self . extra_scopes )
437447 authentication_request = self .authz_state .get_authorization_request_for_access_token (bearer_token )
438448 requested_claims .update (self ._get_requested_claims_in (authentication_request , 'userinfo' ))
439449 user_claims = self .userinfo .get_claims_for (user_id , requested_claims )
0 commit comments