Skip to content
This repository was archived by the owner on May 26, 2020. It is now read-only.

Commit aeee6d4

Browse files
committed
Fix #128
Use USERNAME_FIELD in utils.jwt_payload_handler
1 parent 9a43d63 commit aeee6d4

File tree

9 files changed

+55
-40
lines changed

9 files changed

+55
-40
lines changed

rest_framework_jwt/authentication.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from django.utils.encoding import smart_text
33
from django.utils.translation import ugettext as _
44
from rest_framework import exceptions
5-
from rest_framework.authentication import (BaseAuthentication,
6-
get_authorization_header)
5+
from rest_framework.authentication import (
6+
BaseAuthentication, get_authorization_header
7+
)
78

8-
from rest_framework_jwt import utils
9+
from rest_framework_jwt.compat import get_user_model
910
from rest_framework_jwt.settings import api_settings
1011

1112

13+
User = get_user_model()
1214
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
1315
jwt_get_user_id_from_payload = api_settings.JWT_PAYLOAD_GET_USER_ID_HANDLER
1416

@@ -46,8 +48,6 @@ def authenticate_credentials(self, payload):
4648
"""
4749
Returns an active user that matches the payload's user id and email.
4850
"""
49-
User = utils.get_user_model()
50-
5151
user_id = jwt_get_user_id_from_payload(payload)
5252

5353
if user_id is not None:

rest_framework_jwt/compat.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import rest_framework
2+
23
from distutils.version import StrictVersion
34

45

@@ -9,3 +10,32 @@ class Serializer(rest_framework.serializers.Serializer):
910
@property
1011
def object(self):
1112
return self.validated_data
13+
14+
15+
def get_user_model():
16+
try:
17+
from django.contrib.auth import get_user_model
18+
except ImportError: # Django < 1.5
19+
from django.contrib.auth.models import User
20+
else:
21+
User = get_user_model()
22+
23+
return User
24+
25+
26+
def get_username_field():
27+
try:
28+
username_field = get_user_model().USERNAME_FIELD
29+
except:
30+
username_field = 'username'
31+
32+
return username_field
33+
34+
35+
def get_username(user):
36+
try:
37+
username = user.get_username()
38+
except AttributeError:
39+
username = user.username
40+
41+
return username

rest_framework_jwt/serializers.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
from rest_framework import serializers
99
from .compat import Serializer
1010

11-
from rest_framework_jwt import utils
11+
from rest_framework_jwt.compat import get_user_model, get_username_field
1212
from rest_framework_jwt.settings import api_settings
1313

1414

15+
User = get_user_model()
1516
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
1617
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
1718
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
@@ -39,12 +40,7 @@ def __init__(self, *args, **kwargs):
3940

4041
@property
4142
def username_field(self):
42-
User = utils.get_user_model()
43-
44-
try:
45-
return User.USERNAME_FIELD
46-
except AttributeError:
47-
return 'username'
43+
return get_username_field()
4844

4945
def validate(self, attrs):
5046
credentials = {
@@ -107,7 +103,6 @@ def _check_payload(self, token):
107103
return payload
108104

109105
def _check_user(self, payload):
110-
User = utils.get_user_model()
111106
# Make sure user exists (may want to refactor this)
112107
try:
113108
user_id = jwt_get_user_id_from_payload(payload)

rest_framework_jwt/utils.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,21 @@
22

33
from datetime import datetime
44

5+
from rest_framework_jwt.compat import get_username, get_username_field
56
from rest_framework_jwt.settings import api_settings
67

78

8-
def get_user_model():
9-
try:
10-
from django.contrib.auth import get_user_model
11-
except ImportError: # Django < 1.5
12-
from django.contrib.auth.models import User
13-
else:
14-
User = get_user_model()
15-
16-
return User
17-
18-
199
def jwt_payload_handler(user):
20-
try:
21-
username = user.get_username()
22-
except AttributeError:
23-
username = user.username
24-
25-
return {
10+
payload = {
2611
'user_id': user.pk,
2712
'email': user.email,
28-
'username': username,
2913
'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
3014
}
3115

16+
payload[get_username_field()] = get_username(user)
17+
18+
return payload
19+
3220

3321
def jwt_get_user_id_from_payload_handler(payload):
3422
"""

tests/test_authentication.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from django.test import TestCase
33
from django.utils import unittest
44
from django.conf.urls import patterns
5-
from django.contrib.auth import get_user_model
65

76
from rest_framework import permissions, status
87
try:
@@ -33,6 +32,7 @@
3332
from rest_framework.views import APIView
3433

3534
from rest_framework_jwt import utils
35+
from rest_framework_jwt.compat import get_user_model
3636
from rest_framework_jwt.settings import api_settings, DEFAULTS
3737
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
3838

tests/test_serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import rest_framework
44
from django.test import TestCase
55
from django.utils import unittest
6-
from django.contrib.auth import get_user_model
76

7+
from rest_framework_jwt.compat import get_user_model
88
from rest_framework_jwt.serializers import JSONWebTokenSerializer
99
from rest_framework_jwt import utils
1010

tests/test_utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import json
22
import base64
33

4-
from django.contrib.auth import get_user_model
5-
from django.test import TestCase
64
import jwt.exceptions
5+
from django.test import TestCase
6+
77
from rest_framework_jwt import utils
8+
from rest_framework_jwt.compat import get_user_model
89
from rest_framework_jwt.settings import api_settings, DEFAULTS
910

1011
User = get_user_model()

tests/test_views.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
from django.test.utils import override_settings
77
from django.utils import unittest
88
from django.conf.urls import patterns
9-
from django.contrib.auth import get_user_model
10-
119
from freezegun import freeze_time
12-
1310
from rest_framework import status
1411
from rest_framework.test import APIClient
1512

1613
from rest_framework_jwt import utils
14+
from rest_framework_jwt.compat import get_user_model
1715
from rest_framework_jwt.settings import api_settings, DEFAULTS
1816

1917
from . import utils as test_utils
@@ -192,7 +190,7 @@ def test_jwt_login_json(self):
192190

193191
self.assertEqual(response.status_code, status.HTTP_200_OK)
194192
decoded_payload = utils.jwt_decode_handler(response.data['token'])
195-
self.assertEqual(decoded_payload['username'], self.email)
193+
self.assertEqual(decoded_payload['email'], self.email)
196194

197195
def test_jwt_login_json_bad_creds(self):
198196
"""

tests/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from rest_framework_jwt.compat import get_username
2+
3+
14
def jwt_response_payload_handler(token, user=None, request=None):
25
"""
36
Returns the response data for both the login and refresh views.
@@ -14,6 +17,6 @@ def jwt_response_payload_handler(token, user=None, request=None):
1417
1518
"""
1619
return {
17-
'user': user.get_username(),
20+
'user': get_username(user),
1821
'token': token
1922
}

0 commit comments

Comments
 (0)