diff --git a/src/oidcop/oidc/registration.py b/src/oidcop/oidc/registration.py index b4996cb7..6e451c0d 100755 --- a/src/oidcop/oidc/registration.py +++ b/src/oidcop/oidc/registration.py @@ -22,7 +22,7 @@ from oidcop.exception import CapabilitiesMisMatch from oidcop.exception import InvalidRedirectURIError from oidcop.exception import InvalidSectorIdentifier -from oidcop.util import split_uri +from oidcop.util import split_uri, importer PREFERENCE2PROVIDER = { # "require_signed_request_object": "request_object_algs_supported", @@ -117,6 +117,15 @@ def comb_uri(args): args['request_uris'] = val +def random_client_id(length:int=16, reserved:list=[], **kwargs): + # create new id och secret + client_id = rndstr(16) + # cdb client_id MUST be unique! + while client_id in reserved: + client_id = rndstr(16) + return client_id + + class Registration(Endpoint): request_cls = RegistrationRequest response_cls = RegistrationResponse @@ -394,11 +403,15 @@ def client_registration_setup(self, request, new_id=True, set_secret=True): _context = self.server_get("endpoint_context") if new_id: - # create new id och secret - client_id = rndstr(12) - # cdb client_id MUST be unique! - while client_id in _context.cdb: - client_id = rndstr(12) + if self.kwargs.get('client_id_generator'): + cid_generator = importer( + self.kwargs['client_id_generator']['class'] + ) + cid_gen_kwargs = self.kwargs['client_id_generator'].get('kwargs', {}) + else: + cid_generator = importer('oidcop.oidc.registration.random_client_id') + cid_gen_kwargs = {} + client_id = cid_generator(reserved=_context.cdb.keys(), **cid_gen_kwargs) if "client_id" in request: del request["client_id"] else: