Skip to content

Commit 3230e5c

Browse files
committed
update
1 parent 660e370 commit 3230e5c

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

dojo/middleware.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,15 @@ def __call__(self, request):
8282

8383
class CustomSocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
8484
def process_exception(self, request, exception):
85-
if isinstance(exception, (requests.exceptions.RequestException, AuthCanceled, AuthFailed)):
85+
if isinstance(exception, requests.exceptions.RequestException):
8686
messages.error(request, "Login via social authentication is temporarily unavailable. Please use the standard login below.")
8787
return redirect("/login")
88+
if isinstance(exception, AuthCanceled):
89+
messages.warning(request, "Social login was canceled. Please try again or use the standard login.")
90+
return redirect("/login")
91+
if isinstance(exception, AuthFailed):
92+
messages.error(request, "Social login failed. Please try again or use the standard login.")
93+
return redirect("/login")
8894
return super().process_exception(request, exception)
8995

9096

unittests/test_social_auth_failure_handling.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11

2+
from django.contrib import messages
23
from django.contrib.auth.models import AnonymousUser
34
from django.contrib.messages.storage.fallback import FallbackStorage
45
from django.contrib.sessions.middleware import SessionMiddleware
56
from django.http import HttpResponse
67
from django.test import RequestFactory, override_settings
78
from requests.exceptions import ConnectionError as RequestsConnectionError
9+
from social_core.exceptions import AuthCanceled, AuthFailed
810

911
from dojo.middleware import CustomSocialAuthExceptionMiddleware
1012

@@ -46,10 +48,17 @@ def test_social_auth_exception_redirects_to_login(self):
4648
"/login/keycloak-oauth2/",
4749
"/login/github/",
4850
]
49-
51+
exceptions = [
52+
(RequestsConnectionError("Host unreachable"), "Login via social authentication is temporarily unavailable. Please use the standard login below."),
53+
(AuthCanceled("User canceled login"), "Social login was canceled. Please try again or use the standard login."),
54+
(AuthFailed("Token exchange failed"), "Social login failed. Please try again or use the standard login."),
55+
]
5056
for path in login_paths:
51-
with self.subTest(path=path):
52-
request = self._prepare_request(path)
53-
response = self.middleware.process_exception(request, RequestsConnectionError("Host unreachable"))
54-
self.assertEqual(response.status_code, 302)
55-
self.assertEqual(response.url, "/login")
57+
for exception, expected_message in exceptions:
58+
with self.subTest(path=path, exception=type(exception).__name__):
59+
request = self._prepare_request(path)
60+
response = self.middleware.process_exception(request, exception)
61+
self.assertEqual(response.status_code, 302)
62+
self.assertEqual(response.url, "/login")
63+
storage = list(messages.get_messages(request))
64+
self.assertTrue(any(expected_message in str(msg) for msg in storage))

0 commit comments

Comments
 (0)