from urllib.parse import urlencode, quote_plus from django.contrib.auth import REDIRECT_FIELD_NAME from django.http import HttpResponseRedirect from django.urls import reverse from django.views.decorators.cache import never_cache from django.views.decorators.csrf import csrf_exempt from django.conf import settings as django_settings from social_core.actions import do_complete from social_core.utils import setting_name from social_django.utils import psa from social_django.views import _do_login try: from django.contrib.auth.decorators import login_not_required except ImportError: def login_not_required(func): return func NAMESPACE = getattr(django_settings, setting_name("URL_NAMESPACE"), None) or "social" @never_cache @login_not_required @csrf_exempt @psa(f"{NAMESPACE}:complete") def complete(request, backend, *args, **kwargs): """ Custom social auth complete view. Wraps social_django's do_complete, then redirects authenticated users to set-cookie-html for SSO cookie sync. """ response = do_complete( request.backend, _do_login, user=request.user, redirect_name=REDIRECT_FIELD_NAME, request=request, *args, **kwargs, ) if request.user.is_authenticated and isinstance(response, HttpResponseRedirect): original_redirect = response.url set_cookie_url = '{}?{}'.format( reverse('set-cookie-html'), urlencode({'redirect_to': original_redirect}, quote_via=quote_plus), ) return HttpResponseRedirect(set_cookie_url) return response