Skip to content

Commit ed49892

Browse files
authored
fix: fixing store_jwt view (#185)
## Related Issues Fixes #184 ## Description Fixing an issue that was introduced in latest release Adding a test to maintain it ## Must - [x] Tests - [ ] Documentation (if applicable)
1 parent d2cf45c commit ed49892

File tree

3 files changed

+95
-3
lines changed

3 files changed

+95
-3
lines changed

django_descope/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
settings, "DESCOPE_WEB_COMPONENT_SRC", "https://unpkg.com/@descope/web-component"
66
)
77

8-
MANAGEMENT_KEY = getattr(settings, "DESCOPE_MANAGEMENT_KEY", None)
9-
PROJECT_ID = getattr(settings, "DESCOPE_PROJECT_ID", None)
8+
MANAGEMENT_KEY = getattr(settings, "DESCOPE_MANAGEMENT_KEY", "")
9+
PROJECT_ID = getattr(settings, "DESCOPE_PROJECT_ID", "")
1010
if not PROJECT_ID:
1111
raise ImproperlyConfigured('"DESCOPE_PROJECT_ID" is required!')
1212

django_descope/test_store_jwt.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import json
2+
import logging
3+
import random
4+
import string
5+
6+
import descope
7+
from descope import (
8+
REFRESH_SESSION_COOKIE_NAME,
9+
REFRESH_SESSION_TOKEN_NAME,
10+
SESSION_COOKIE_NAME,
11+
SESSION_TOKEN_NAME,
12+
)
13+
from django.contrib.auth.mixins import LoginRequiredMixin
14+
from django.http import JsonResponse
15+
from django.test import TestCase, override_settings
16+
from django.urls import path, reverse
17+
from django.views import View
18+
19+
from . import descope_client, urls
20+
21+
logger = logging.getLogger(__name__)
22+
23+
24+
def random_string(N: int) -> str:
25+
return "".join(random.choices(string.ascii_lowercase + string.digits, k=N))
26+
27+
28+
class TestProtectedView(LoginRequiredMixin, View):
29+
def get(self, request):
30+
return JsonResponse({"success": True})
31+
32+
33+
urls.urlpatterns = urls.urlpatterns + [
34+
path("test", TestProtectedView.as_view(), name="test_protected_view"),
35+
]
36+
37+
38+
@override_settings(ROOT_URLCONF=urls)
39+
class StoreJwtTestCase(TestCase):
40+
delivery_method = descope.DeliveryMethod.EMAIL
41+
login_id = f"test+{random_string(8)}@test.internal"
42+
token: dict
43+
44+
def setUp(self) -> None:
45+
descope_client.mgmt.user.create_test_user(
46+
self.login_id, role_names=["is_staff", "is_superuser"], verified_email=True
47+
)
48+
resp = descope_client.mgmt.user.generate_otp_for_test_user(
49+
self.delivery_method,
50+
self.login_id,
51+
)
52+
self.token = descope_client.otp.verify_code(
53+
self.delivery_method, self.login_id, resp.get("code")
54+
)
55+
56+
def test_store_jwt(self):
57+
"""Test the store_jwt view"""
58+
59+
# should fail without a session
60+
res = self.client.get(reverse("test_protected_view"))
61+
self.assertNotEqual(res.status_code, 200)
62+
63+
# lets store the jwt
64+
res = self.client.post(
65+
reverse("store_jwt"),
66+
{
67+
SESSION_COOKIE_NAME: self.token[SESSION_TOKEN_NAME]["jwt"],
68+
REFRESH_SESSION_COOKIE_NAME: self.token[REFRESH_SESSION_TOKEN_NAME][
69+
"jwt"
70+
],
71+
},
72+
)
73+
self.assertEqual(res.status_code, 200)
74+
75+
debug = json.loads(res.content)
76+
self.assertEqual(debug["success"], True)
77+
session = self.client.session
78+
self.assertEqual( # ensure the session was updated
79+
session[SESSION_COOKIE_NAME], self.token[SESSION_TOKEN_NAME]["jwt"]
80+
)
81+
self.assertEqual( # ensure the session was updated
82+
session[REFRESH_SESSION_COOKIE_NAME],
83+
self.token[REFRESH_SESSION_TOKEN_NAME]["jwt"],
84+
)
85+
86+
# should succeed with a session
87+
res = self.client.get(reverse("test_protected_view"))
88+
self.assertEqual(res.status_code, 200)
89+
self.assertEqual(debug["success"], True)
90+
91+
def tearDown(self) -> None:
92+
descope_client.mgmt.user.delete(self.login_id)

django_descope/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def post(self, request: HttpRequest):
2020
refresh = request.POST.get(REFRESH_SESSION_COOKIE_NAME)
2121

2222
if session and refresh:
23-
add_tokens_to_request(request, session, refresh)
23+
add_tokens_to_request(request.session, session, refresh)
2424
return JsonResponse({"success": True})
2525

2626
return HttpResponseBadRequest()

0 commit comments

Comments
 (0)