Commit 85b85dd6 by Nickersoft

Added user full name support in JWT authentication

- Added full_name field to user model
- Updated the JWT auth to set user's full name from token
parent db2ea567
...@@ -51,8 +51,9 @@ class JwtAuthentication(JSONWebTokenAuthentication): ...@@ -51,8 +51,9 @@ class JwtAuthentication(JSONWebTokenAuthentication):
try: try:
user, __ = User.objects.get_or_create(username=username) user, __ = User.objects.get_or_create(username=username)
is_update = False is_update = False
for attr in ('email', 'tracking_context'): for attr in ('full_name', 'email', 'tracking_context'):
payload_value = payload.get(attr) payload_value = payload.get(attr)
if getattr(user, attr) != payload_value and payload_value is not None: if getattr(user, attr) != payload_value and payload_value is not None:
setattr(user, attr, payload_value) setattr(user, attr, payload_value)
is_update = True is_update = True
......
# -*- coding: UTF-8 -*-
import json import json
from django.conf import settings from django.conf import settings
...@@ -6,7 +7,7 @@ from django.test import TestCase, override_settings, RequestFactory ...@@ -6,7 +7,7 @@ from django.test import TestCase, override_settings, RequestFactory
from oscar.test import factories from oscar.test import factories
from rest_framework.exceptions import AuthenticationFailed from rest_framework.exceptions import AuthenticationFailed
from ecommerce.extensions.api.authentication import BearerAuthentication from ecommerce.extensions.api.authentication import BearerAuthentication, JwtAuthentication
OAUTH2_PROVIDER_URL = 'https://example.com/oauth2' OAUTH2_PROVIDER_URL = 'https://example.com/oauth2'
...@@ -101,3 +102,16 @@ class BearerAuthenticationTests(AccessTokenMixin, TestCase): ...@@ -101,3 +102,16 @@ class BearerAuthenticationTests(AccessTokenMixin, TestCase):
request = self._create_request() request = self._create_request()
self.assertEqual(self.auth.authenticate(request), (user, self.DEFAULT_TOKEN)) self.assertEqual(self.auth.authenticate(request), (user, self.DEFAULT_TOKEN))
class JwtAuthenticationTests(TestCase):
def test_authenticate_credentials_user_creation(self):
""" Test whether the user model is being assigned fields from the payload. """
full_name = 'George Costanza'
email = 'gcostanza@gmail.com'
username = 'gcostanza'
payload = {'username': username, 'email': email, 'full_name': full_name}
user = JwtAuthentication().authenticate_credentials(payload)
self.assertEquals(user.username, username)
self.assertEquals(user.email, email)
self.assertEquals(user.full_name, full_name)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('user', '0002_user_tracking_context'),
]
operations = [
migrations.AddField(
model_name='user',
name='full_name',
field=models.CharField(max_length=255, null=True, verbose_name='full name', blank=True),
preserve_default=True,
),
]
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from jsonfield.fields import JSONField from jsonfield.fields import JSONField
from django.db import models
from django.utils.translation import ugettext_lazy as _
class User(AbstractUser): class User(AbstractUser):
"""Custom user model for use with OIDC.""" """Custom user model for use with OIDC."""
full_name = models.CharField(_('Full Name'), max_length=255, blank=True, null=True)
@property @property
def access_token(self): def access_token(self):
try: try:
...@@ -16,3 +21,6 @@ class User(AbstractUser): ...@@ -16,3 +21,6 @@ class User(AbstractUser):
class Meta(object): class Meta(object):
get_latest_by = 'date_joined' get_latest_by = 'date_joined'
db_table = 'ecommerce_user' db_table = 'ecommerce_user'
def get_full_name(self):
return self.full_name or super(User, self).get_full_name()
...@@ -32,3 +32,18 @@ class UserTests(TestCase): ...@@ -32,3 +32,18 @@ class UserTests(TestCase):
same_user = User.objects.get(id=user.id) same_user = User.objects.get(id=user.id)
self.assertEqual(same_user.tracking_context, self.TEST_CONTEXT) self.assertEqual(same_user.tracking_context, self.TEST_CONTEXT)
def test_get_full_name(self):
""" Test that the user model concatenates first and last name if the full name is not set. """
full_name = "George Costanza"
user = G(User, full_name=full_name)
self.assertEquals(user.get_full_name(), full_name)
first_name = "Jerry"
last_name = "Seinfeld"
user = G(User, full_name=None, first_name=first_name, last_name=last_name)
expected = "{first_name} {last_name}".format(first_name=first_name, last_name=last_name)
self.assertEquals(user.get_full_name(), expected)
user = G(User, full_name=full_name, first_name=first_name, last_name=last_name)
self.assertEquals(user.get_full_name(), full_name)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment