File tree Expand file tree Collapse file tree 4 files changed +47
-6
lines changed
Expand file tree Collapse file tree 4 files changed +47
-6
lines changed Original file line number Diff line number Diff line change 11import 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
39from 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 )
Original file line number Diff line number Diff line change 88from django .contrib import auth
99from django .http import HttpResponseRedirect
1010from django .utils .crypto import get_random_string
11+ from django .utils .module_loading import import_string
1112from django .views .generic import View
1213
1314from mozilla_django_oidc .utils import absolutify , import_from_settings
@@ -104,14 +105,21 @@ def get(self, request):
104105class 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 )
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 :
You can’t perform that action at this time.
0 commit comments