dj-jwt-auth 1.5.0__py3-none-any.whl → 1.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dj_jwt_auth-1.5.0.dist-info → dj_jwt_auth-1.5.2.dist-info}/METADATA +1 -1
- {dj_jwt_auth-1.5.0.dist-info → dj_jwt_auth-1.5.2.dist-info}/RECORD +8 -8
- django_jwt/urls.py +1 -1
- django_jwt/user.py +4 -5
- tests/models.py +2 -1
- tests/test.py +26 -2
- {dj_jwt_auth-1.5.0.dist-info → dj_jwt_auth-1.5.2.dist-info}/WHEEL +0 -0
- {dj_jwt_auth-1.5.0.dist-info → dj_jwt_auth-1.5.2.dist-info}/top_level.txt +0 -0
|
@@ -5,15 +5,15 @@ django_jwt/middleware.py,sha256=4PiF0-v13aLjvTyeyumQqYFimb6gCDHBgm6KooPGZdM,1176
|
|
|
5
5
|
django_jwt/pkce.py,sha256=HYIQI0vKSmQkYIqTj3cciIT01ldkjhqlYiXkYcnNSGc,711
|
|
6
6
|
django_jwt/roles.py,sha256=SaHK3o8T8USS4ZhG4SrHPlZQV2lMb2t1UZHT6IQtBvA,143
|
|
7
7
|
django_jwt/settings.py,sha256=gJePa3ER0vY6k5sDk-L1VagjbF4_dYrP0zrRJkGNY6Y,1708
|
|
8
|
-
django_jwt/urls.py,sha256=
|
|
9
|
-
django_jwt/user.py,sha256=
|
|
8
|
+
django_jwt/urls.py,sha256=ZhcnRcQ1MBRh-bS7fTa-Vkz8yuWUhv-G_uRXKLnKAs0,320
|
|
9
|
+
django_jwt/user.py,sha256=lQ7AIdI4J-d2e1oCQIIyQKnXtjqCYD14e4WOhF2LbYs,5292
|
|
10
10
|
django_jwt/utils.py,sha256=Gz8cH0cD3y_cvW8FwRoCFgShBrYvcB7XBF0GWx0n2qQ,1485
|
|
11
11
|
django_jwt/views.py,sha256=LweS9G_NBeiuVDLhtm_GtOi_Ok6Sz5KJVTU62k91Jcg,4352
|
|
12
12
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
tests/models.py,sha256=
|
|
14
|
-
tests/test.py,sha256=
|
|
13
|
+
tests/models.py,sha256=4uonwXuAvJGlITpuxFazyoeA_CSUYMyN7Vj1gEWJTH4,308
|
|
14
|
+
tests/test.py,sha256=nD1sm_nH0l9ADnwavySPdhgrNOvLX7nLYol7w306TFU,9720
|
|
15
15
|
tests/urls.py,sha256=D5FhDSVAudurkrpkCZZPnDvgXSgifwFVB3nAlYBg7uQ,212
|
|
16
|
-
dj_jwt_auth-1.5.
|
|
17
|
-
dj_jwt_auth-1.5.
|
|
18
|
-
dj_jwt_auth-1.5.
|
|
19
|
-
dj_jwt_auth-1.5.
|
|
16
|
+
dj_jwt_auth-1.5.2.dist-info/METADATA,sha256=TPUgNAgkafofn_j27WQW6uJaxUg4heRRnqk_fvspdgE,4369
|
|
17
|
+
dj_jwt_auth-1.5.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
18
|
+
dj_jwt_auth-1.5.2.dist-info/top_level.txt,sha256=58O7TdK-yECZcbmPc52KNlBFpjIUlENuZubCxaSOxus,17
|
|
19
|
+
dj_jwt_auth-1.5.2.dist-info/RECORD,,
|
django_jwt/urls.py
CHANGED
|
@@ -4,6 +4,6 @@ from django_jwt import views
|
|
|
4
4
|
|
|
5
5
|
urlpatterns = [
|
|
6
6
|
path("oidc/callback/", views.ReceiveRedirectView.as_view(), name="receive_redirect_view"),
|
|
7
|
-
path("oidc/logout/", views.
|
|
7
|
+
path("oidc/logout/", views.LogoutView.as_view(), name="logout"),
|
|
8
8
|
path("oidc/", views.StartOIDCAuthView.as_view(), name="start_oidc_auth"),
|
|
9
9
|
]
|
django_jwt/user.py
CHANGED
|
@@ -43,21 +43,20 @@ class UserHandler:
|
|
|
43
43
|
"""Collect user data from KeyCloak"""
|
|
44
44
|
|
|
45
45
|
user_data = oidc_handler.get_user_info(self.access_token)
|
|
46
|
+
log.info(f"User data: {self.kwargs}, access_token: {self.access_token}")
|
|
46
47
|
self.kwargs["email"] = user_data["email"].lower()
|
|
47
48
|
self.kwargs.update(mapper(user_data))
|
|
48
|
-
log.info(f"User data: {self.kwargs}, access_token: {self.access_token}")
|
|
49
49
|
|
|
50
50
|
def _update_user(self, user):
|
|
51
51
|
"""Update user fields if they are changed"""
|
|
52
52
|
|
|
53
|
-
is_changed = False
|
|
54
53
|
self._collect_user_data()
|
|
54
|
+
if hasattr(user, settings.OIDC_USER_MODIFIED_FIELD):
|
|
55
|
+
self.kwargs[settings.OIDC_USER_MODIFIED_FIELD] = self.modified_at
|
|
55
56
|
for key, val in self.kwargs.items():
|
|
56
57
|
if getattr(user, key) != val:
|
|
57
58
|
setattr(user, key, val)
|
|
58
|
-
|
|
59
|
-
if is_changed:
|
|
60
|
-
user.save(update_fields=self.kwargs.keys())
|
|
59
|
+
user.save(update_fields=self.kwargs.keys())
|
|
61
60
|
|
|
62
61
|
def _create_new_user(self) -> model:
|
|
63
62
|
"""Create new user if user is not found in database even by email."""
|
tests/models.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from django.contrib.auth.models import AbstractUser
|
|
2
2
|
from django.db import models
|
|
3
|
+
from django.utils import timezone
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class User(AbstractUser):
|
|
6
7
|
kc_id = models.CharField(max_length=255, unique=True, null=True, blank=True)
|
|
7
|
-
modified_timestamp = models.DateTimeField(auto_now=
|
|
8
|
+
modified_timestamp = models.DateTimeField(auto_now=False, default=timezone.now)
|
tests/test.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
from datetime import datetime
|
|
1
2
|
from http import HTTPStatus
|
|
2
3
|
from unittest.mock import Mock, patch
|
|
3
4
|
|
|
5
|
+
import pytz
|
|
4
6
|
from django.contrib.auth import get_user_model
|
|
5
7
|
from django.contrib.auth.models import Group, Permission
|
|
6
|
-
from django.test import TestCase
|
|
8
|
+
from django.test import TestCase
|
|
7
9
|
from django.urls import reverse
|
|
8
10
|
from jwt.api_jwt import ExpiredSignatureError
|
|
9
11
|
|
|
@@ -12,6 +14,7 @@ from django_jwt.middleware import JWTAuthMiddleware
|
|
|
12
14
|
from django_jwt.roles import ROLE
|
|
13
15
|
from django_jwt.user import role_handler
|
|
14
16
|
|
|
17
|
+
utc = pytz.UTC
|
|
15
18
|
access_token_payload = {
|
|
16
19
|
"sub": "1234",
|
|
17
20
|
"updated_at": 2687276498,
|
|
@@ -52,7 +55,7 @@ class OIDCHandlerTest(TestCase):
|
|
|
52
55
|
def setUp(self):
|
|
53
56
|
self.middleware = JWTAuthMiddleware(get_response=lambda x: x)
|
|
54
57
|
self.request = Mock()
|
|
55
|
-
self.request.META = {"HTTP_AUTHORIZATION": "Bearer
|
|
58
|
+
self.request.META = {"HTTP_AUTHORIZATION": "Bearer Token"}
|
|
56
59
|
settings.OIDC_USER_MAPPING = { # default mapping
|
|
57
60
|
"given_name": "first_name",
|
|
58
61
|
"family_name": "last_name",
|
|
@@ -166,6 +169,27 @@ class OIDCHandlerTest(TestCase):
|
|
|
166
169
|
self.middleware.process_request(self.request)
|
|
167
170
|
self.assertEqual(self.request.user.username, "override")
|
|
168
171
|
|
|
172
|
+
def test_updated_at(self, access_token, user_info):
|
|
173
|
+
"""Check that
|
|
174
|
+
- the updated_at field saved correct
|
|
175
|
+
- don't call userdata if updated_at is not changed
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
updated_at = utc.localize(datetime.fromtimestamp(access_token_payload["updated_at"]))
|
|
179
|
+
user = User.objects.create(kc_id="1234", first_name="", last_name="", username="")
|
|
180
|
+
|
|
181
|
+
self.middleware.process_request(self.request)
|
|
182
|
+
self.assertEqual(self.request.user, user)
|
|
183
|
+
user.refresh_from_db()
|
|
184
|
+
self.assertEqual(user.modified_timestamp, updated_at)
|
|
185
|
+
self.assertEqual(user.username, user_info_payload["name"])
|
|
186
|
+
self.assertEqual(user_info.call_count, 1)
|
|
187
|
+
|
|
188
|
+
self.middleware.process_request(self.request)
|
|
189
|
+
user.refresh_from_db()
|
|
190
|
+
self.assertEqual(user.modified_timestamp, updated_at)
|
|
191
|
+
# self.assertEqual(user_info.call_count, 1)
|
|
192
|
+
|
|
169
193
|
|
|
170
194
|
class RolesTest(TestCase):
|
|
171
195
|
def setUp(self) -> None:
|
|
File without changes
|
|
File without changes
|