Skip to content

Commit 5c0585c

Browse files
authored
Merge pull request #67 from akatsoulas/post-logout
Logout user from OP.
2 parents 45f9db9 + 98d7807 commit 5c0585c

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

mozilla_django_oidc/contrib/auth0/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import requests
2+
try:
3+
from urllib import urlencode
4+
except ImportError:
5+
from urllib.parse import urlencode
6+
7+
from django.http import HttpResponseRedirect
28

39
from mozilla_django_oidc.utils import import_from_settings
410

@@ -18,3 +24,13 @@ def refresh_id_token(id_token):
1824
if response.status_code == requests.codes.ok:
1925
return response.json().get('id_token')
2026
return None
27+
28+
29+
def logout(request):
30+
"""Log out the user from Auth0."""
31+
url = 'https//' + import_from_settings('OIDC_OP_DOMAIN') + '/v2/logout'
32+
url += '?' + urlencode({
33+
'returnTo': import_from_settings('OIDC_OP_LOGOUT_URL', '/'),
34+
'client_id': import_from_settings('OIDC_RP_CLIENT_ID')
35+
})
36+
return HttpResponseRedirect(url)

mozilla_django_oidc/views.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.contrib import auth
99
from django.http import HttpResponseRedirect
1010
from django.utils.crypto import get_random_string
11+
from django.utils.module_loading import import_string
1112
from django.views.generic import View
1213

1314
from mozilla_django_oidc.utils import absolutify, import_from_settings
@@ -104,14 +105,21 @@ def get(self, request):
104105
class OIDCLogoutView(View):
105106
"""Logout helper view"""
106107

107-
http_method_names = ['get']
108+
http_method_names = ['get', 'post']
108109

109110
@property
110111
def redirect_url(self):
111112
"""Return the logout url defined in settings."""
112113
return import_from_settings('LOGOUT_REDIRECT_URL', '/')
113114

114-
def get(self, request):
115-
"""Log the user out"""
116-
auth.logout(request)
115+
def dispatch(self, request, *args, **kwargs):
116+
"""Log out the user."""
117+
118+
if request.user.is_authenticated():
119+
auth.logout(request)
120+
121+
logout_view_path = import_from_settings('OIDC_OP_LOGOUT_VIEW', '')
122+
if logout_view_path:
123+
logout_view = import_string(logout_view_path)
124+
return logout_view(request)
117125
return HttpResponseRedirect(self.redirect_url)

tests/auth0_tests/test_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Auth0UtilsTestCase(TestCase):
1212
@override_settings(OIDC_RP_CLIENT_ID='client_id')
1313
@override_settings(OIDC_OP_DOMAIN='op_domain')
1414
@patch('mozilla_django_oidc.contrib.auth0.utils.requests.post')
15-
def test_successful_refresh_token(self, mock_post):
15+
def test_successful_attempt_to_refresh_token(self, mock_post):
1616
"""Test a successful attempt for a refresh id_token."""
1717
mock_response = Mock()
1818
mock_response.status_code = 200
@@ -25,7 +25,7 @@ def test_successful_refresh_token(self, mock_post):
2525
@override_settings(OIDC_RP_CLIENT_ID='client_id')
2626
@override_settings(OIDC_OP_DOMAIN='op_domain')
2727
@patch('mozilla_django_oidc.contrib.auth0.utils.requests.post')
28-
def test_unsuccessful_attempt(self, mock_post):
28+
def test_unsuccessful_attempt_to_refresh_token(self, mock_post):
2929
"""Test an attempt to get a refresh token that raises an error."""
3030
mock_response = Mock()
3131
mock_response.status_code = 401

tests/test_views.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,25 @@ def setUp(self):
290290

291291
@override_settings(LOGOUT_REDIRECT_URL='/example-logout')
292292
def test_get(self):
293+
user = User.objects.create_user('example_username')
293294
url = reverse('oidc_logout')
294295
request = self.factory.get(url)
296+
request.user = user
297+
logout_view = views.OIDCLogoutView.as_view()
298+
299+
with patch('mozilla_django_oidc.views.auth.logout') as mock_logout:
300+
response = logout_view(request)
301+
mock_logout.assert_called_once_with(request)
302+
303+
self.assertEqual(response.status_code, 302)
304+
self.assertEqual(response.url, '/example-logout')
305+
306+
@override_settings(LOGOUT_REDIRECT_URL='/example-logout')
307+
def test_post(self):
308+
user = User.objects.create_user('example_username')
309+
url = reverse('oidc_logout')
310+
request = self.factory.post(url)
311+
request.user = user
295312
logout_view = views.OIDCLogoutView.as_view()
296313

297314
with patch('mozilla_django_oidc.views.auth.logout') as mock_logout:

0 commit comments

Comments
 (0)