Added OIDC_ID_TOKEN_PROCESSING_HOOK functionality

This commit is contained in:
Wojciech Bartosiak 2016-02-12 16:02:35 +00:00
parent 22c53abd63
commit 7a357001b6
7 changed files with 55 additions and 9 deletions

2
.gitignore vendored
View file

@ -7,3 +7,5 @@ dist/
.tox
.coverage
src/
.venv
.idea

View file

@ -1,4 +1,3 @@
from django.conf import settings as django_settings
from django.core.urlresolvers import reverse
from django.http import HttpResponse
@ -49,3 +48,15 @@ def default_after_userlogin_hook(request, user, client):
Default function for setting OIDC_AFTER_USERLOGIN_HOOK.
"""
return None
def additional_id_token_processing_hook(id_token):
"""
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
:return: custom modified dictionary of values for `id_token`
:rtype dict
"""
return id_token

View file

@ -44,6 +44,8 @@ def create_id_token(user, aud, nonce):
if nonce:
dic['nonce'] = str(nonce)
dic = settings.get('OIDC_ID_TOKEN_PROCESSING_HOOK', import_str=True)(dic)
return dic

View file

@ -97,6 +97,14 @@ class DefaultSettings(object):
"""
return 'oidc_provider.lib.utils.common.DefaultUserInfo'
@property
def OIDC_ID_TOKEN_PROCESSING_HOOK(self):
"""
OPTIONAL. A string with the location of your hook.
Used to add extra dictionary values specific for your app into id_token.
"""
return 'oidc_provider.lib.utils.common.additional_id_token_processing_hook'
default_settings = DefaultSettings()

View file

@ -1,4 +1,6 @@
import os
import random
import string
try:
from urlparse import parse_qs, urlsplit
except ImportError:
@ -9,7 +11,8 @@ from django.contrib.auth.models import User
from oidc_provider.models import *
FAKE_NONCE = 'cb584e44c43ed6bd0bc2d9c7e242837d'
FAKE_NONCE = 'cb584e44c43ed6bd0bc2d9c7e242837d'
FAKE_RANDOM_STRING = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(32))
def create_fake_user():
@ -103,3 +106,11 @@ def fake_sub_generator(user):
Fake function for setting OIDC_IDTOKEN_SUB_GENERATOR.
"""
return user.email
def fake_id_token_processing_hook(id_token):
"""
Fake function for inserting some keys into token. Testing OIDC_ID_TOKEN_PROCESSING_HOOK
"""
id_token['test_id_token_processing_hook'] = FAKE_RANDOM_STRING
return id_token

View file

@ -1,16 +1,12 @@
from base64 import b64encode
import json
try:
from urllib.parse import urlencode
except ImportError:
from urllib import urlencode
import uuid
from django.core.urlresolvers import reverse
from django.test import RequestFactory, override_settings
from django.test import TestCase
from jwkest.jwk import KEYS
from jwkest.jws import JWS
from jwkest.jwt import JWT
from mock import patch
@ -339,3 +335,19 @@ class TokenTestCase(TestCase):
id_token = JWT().unpack(response_dic['id_token'].encode('utf-8')).payload()
self.assertEqual(id_token.get('sub'), self.user.email)
@override_settings(OIDC_ID_TOKEN_PROCESSING_HOOK='oidc_provider.tests.app.utils.fake_id_token_processing_hook')
def test_additional_id_token_processing_hook(self):
"""
Test custom function for setting OIDC_ID_TOKEN_PROCESSING_HOOK.
"""
code = self._create_code()
post_data = self._auth_code_post_data(code=code.code)
response = self._post_request(post_data)
response_dic = json.loads(response.content.decode('utf-8'))
id_token = JWT().unpack(response_dic['id_token'].encode('utf-8')).payload()
self.assertEqual(id_token.get('test_id_token_processing_hook'), FAKE_RANDOM_STRING)

View file

@ -6,9 +6,9 @@ envlist=
[testenv]
deps =
django17: django==1.7
django18: django==1.8
django19: django==1.9
django17: django>=1.7,<1.8
django18: django>=1.8,<1.9
django19: django>=1.9,<2.0
coverage
mock