diff --git a/.gitignore b/.gitignore index 21e397b..fa1d0dc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ dist/ src/ .venv .idea +docs/_build/ diff --git a/docs/sections/settings.rst b/docs/sections/settings.rst index f8fcbc9..f3e4329 100644 --- a/docs/sections/settings.rst +++ b/docs/sections/settings.rst @@ -96,7 +96,16 @@ OIDC_IDTOKEN_PROCESSING_HOOK ============================ OPTIONAL. ``str``. A string with the location of your function hook. -here you can add extra dictionary values specific for your app into id_token. +Here you can add extra dictionary values specific for your app into id_token. + +The function receives a ``id_token`` dictionary and ``user`` instance +and returns it with additional fields. + +Default is:: + + def default_idtoken_processing_hook(id_token, user): + + return id_token OIDC_IDTOKEN_SUB_GENERATOR ========================== diff --git a/oidc_provider/lib/utils/common.py b/oidc_provider/lib/utils/common.py index c97c7e8..85983e7 100644 --- a/oidc_provider/lib/utils/common.py +++ b/oidc_provider/lib/utils/common.py @@ -49,12 +49,13 @@ def default_after_userlogin_hook(request, user, client): """ return None -def default_idtoken_processing_hook(id_token): +def default_idtoken_processing_hook(id_token, user): """ Hook to perform some additional actions ti `id_token` dictionary just before serialization. :param id_token: dictionary contains values that going to be serialized into `id_token` :type id_token: dict + :param user: user instance :return: custom modified dictionary of values for `id_token` :rtype dict """ diff --git a/oidc_provider/lib/utils/token.py b/oidc_provider/lib/utils/token.py index 67bfb91..0faa1eb 100644 --- a/oidc_provider/lib/utils/token.py +++ b/oidc_provider/lib/utils/token.py @@ -44,7 +44,7 @@ def create_id_token(user, aud, nonce): if nonce: dic['nonce'] = str(nonce) - dic = settings.get('OIDC_IDTOKEN_PROCESSING_HOOK', import_str=True)(dic) + dic = settings.get('OIDC_IDTOKEN_PROCESSING_HOOK', import_str=True)(dic, user) return dic diff --git a/oidc_provider/tests/app/utils.py b/oidc_provider/tests/app/utils.py index a644298..9b76233 100644 --- a/oidc_provider/tests/app/utils.py +++ b/oidc_provider/tests/app/utils.py @@ -108,9 +108,10 @@ def fake_sub_generator(user): return user.email -def fake_idtoken_processing_hook(id_token): +def fake_idtoken_processing_hook(id_token, user): """ Fake function for inserting some keys into token. Testing OIDC_IDTOKEN_PROCESSING_HOOK. """ id_token['test_idtoken_processing_hook'] = FAKE_RANDOM_STRING + id_token['test_idtoken_processing_hook_user_email'] = user.email return id_token diff --git a/oidc_provider/tests/test_token_endpoint.py b/oidc_provider/tests/test_token_endpoint.py index 0cbc7c3..24e49c2 100644 --- a/oidc_provider/tests/test_token_endpoint.py +++ b/oidc_provider/tests/test_token_endpoint.py @@ -351,3 +351,4 @@ class TokenTestCase(TestCase): id_token = JWT().unpack(response_dic['id_token'].encode('utf-8')).payload() self.assertEqual(id_token.get('test_idtoken_processing_hook'), FAKE_RANDOM_STRING) + self.assertEqual(id_token.get('test_idtoken_processing_hook_user_email'), self.user.email)