Skip to content

Commit bfad8e6

Browse files
committed
Support requesting claims through extra scopes
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent 557c561 commit bfad8e6

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/pyop/provider.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
class 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

Comments
 (0)