python-social-auth AuthCanceled exception
Solution 1
you can create a middleware and catch any exceptions, exception list: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py in this case your AuthCanceled Exception.
middleware.py
from social.apps.django_app.middleware import SocialAuthExceptionMiddleware
from django.shortcuts import HttpResponse
from social import exceptions as social_exceptions
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return HttpResponse("I'm the Pony %s" % exception)
else:
raise exception
settings.py
MIDDLEWARE_CLASSES = (
.....
'pat_to_middleware.SocialAuthExceptionMiddleware',
)
Solution 2
python-social-auth
is a newer, derived version of django-social-auth
.
AlexYar's answer can be slightly modified to work with python-social-auth
by modify settings.py
with following changes:
-
Add a middleware to handle the SocialAuthException
MIDDLEWARE_CLASSES += ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', )
-
URL to redirect to, when an exception occurred
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
-
Note that you also need to set
DEBUG = False
That's all or read http://python-social-auth.readthedocs.org/en/latest/configuration/django.html#exceptions-middleware
Solution 3
This is slight modification of @Nicolas answer and this works for me.
middleware.py
from social.apps.django_app.middleware import SocialAuthExceptionMiddleware
from django.shortcuts import render
from social.exceptions import AuthCanceled
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if type(exception) == AuthCanceled:
return render(request, "pysocial/authcancelled.html", {})
else:
pass
settings.py
MIDDLEWARE_CLASSES += (
'myapp.middleware.SocialAuthExceptionMiddleware',
)
Solution 4
The 2018 answer:
-
Add
SocialAuthExceptionMiddleware
middleware to your config:MIDDLEWARE_CLASSES = [ ... 'social_django.middleware.SocialAuthExceptionMiddleware', ]
-
Set
SOCIAL_AUTH_LOGIN_ERROR_URL
in your config:SOCIAL_AUTH_LOGIN_ERROR_URL = '/login'
Now when you have DEBUG = False
, your users will get redirected to your login page when they click cancel in social auth provider's page.
When DEBUG = True
you will still see the error page in your browser during development.
Solution 5
Just add in
MIDDLEWARE_CLASSES = ( 'social_auth.middleware.SocialAuthExceptionMiddleware', )
and something like
LOGIN_ERROR_URL = '/'
That's all or read http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
cansadadeserfeliz
python django ruby rails javascriptpostgresql sass linux git mercurial
Updated on June 08, 2022Comments
-
cansadadeserfeliz almost 2 years
I'm using python-social-auth in my Django application for authentication via Facebook. But when a user tries to login, they have been redirected to the Facebook app page, and they click on the "Cancel" button, the following exception appears:
ERROR 2014-01-03 15:32:15,308 base :: Internal Server Error: /complete/facebook/ Traceback (most recent call last): File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view return view_func(*args, **kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 45, in wrapper return func(request, backend, *args, **kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/views.py", line 21, in complete redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/actions.py", line 54, in do_complete *args, **kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/strategies/base.py", line 62, in complete return self.backend.auth_complete(*args, **kwargs) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 63, in auth_complete self.process_error(self.data) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 56, in process_error super(FacebookOAuth2, self).process_error(data) File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/oauth.py", line 312, in process_error raise AuthCanceled(self, data.get('error_description', '')) AuthCanceled: Authentication process canceled
Is the any way to catch it Django?
-
Ryu_hayabusa about 10 yearshasattr(social_exceptions, 'AuthCanceled') returns true even if the exception is not AuthCanceled. It catches all other errors even 404.
-
chipmunk about 10 yearsIts
from social_auth.middleware import SocialAuthExceptionMiddleware
-
Ryu_hayabusa about 10 years@Chipmunk This answer is for python-social-auth , not for django-social-auth.
-
Mutant about 10 yearsIts better to use different name for middleware than default class name SocialAuthExceptionMiddleware for clarity (which is matching the import)
-
Catskul almost 10 yearsCaution, this will not work if INSTALLED_APPS includes 'debug_toolbar' as it wraps the middleware and prevents the exception from percolating through the process_exception functions
-
Nicolás almost 10 yearsYes, it's only an example.
-
Mike McCoy over 9 yearsNote that this does not work for
python-social-auth
, the newer version. See @nattster's answer for the correct method. -
Javier C. H. almost 9 yearsfinally an answer that works for the newer version! thanks :)
-
nucklehedd about 8 yearsThe key part for me was to set
DEBUG = False
This was driving me nuts, thanks for the answer! -
user1388835 almost 4 yearsThanks Man..worked like charm. I am really thankful to stackoverflow. Its magic!
-
Mark Chackerian over 3 yearsAs of 2020, this is the correct answer -- have verified with social-auth-app-django 4.0.0 and Django 3.0