Python-social-authcanceled exception
j'utilise python-social-auth dans mon application Django pour l'authentification via Facebook. Mais quand un utilisateur essaie de se connecter et quand il a été redirigé vers la page de L'application Facebook clique sur le bouton "Cancel", apparaît l'exception suivante:
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
est-il possible de l'attraper Django?
7 réponses
vous pouvez créer un middleware et attraper toutes les exceptions, liste d'exceptions: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py dans ce cas, votre 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',
)
python-social-auth
est une nouvelle version dérivée de django-social-auth
.
AlexYar réponse peut être légèrement modifié pour fonctionner avec les python-social-auth
par modifier settings.py
avec les modifications suivantes:
-
Ajouter un middleware pour gérer la SocialAuthException" 15198090920"
MIDDLEWARE_CLASSES += ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', )
-
URL de redirection, lorsqu'une exception s'est produite
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
-
notez que vous devez aussi définir
DEBUG = False
C'est tout ou lire http://python-social-auth.readthedocs.org/en/latest/configuration/django.html#exceptions-middleware
c'est une légère modification de la réponse de @Nicolas et cela fonctionne pour moi.
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',
)
il suffit d'ajouter
MIDDLEWARE_CLASSES = ( "social_auth.intergiciel.SocialAuthExceptionMiddleware", )
et quelque chose comme
LOGIN_ERROR_URL = ' / '
C'est tout ou lire http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
la réponse de 2018:
-
ajouter
SocialAuthExceptionMiddleware
middleware à votre configuration:MIDDLEWARE_CLASSES = [ ... 'social_django.middleware.SocialAuthExceptionMiddleware', ]
-
Set
SOCIAL_AUTH_LOGIN_ERROR_URL
dans votre configuration:SOCIAL_AUTH_LOGIN_ERROR_URL = '/login'
maintenant que vous avez DEBUG = False
, vos utilisateurs seront redirigés vers votre page de connexion quand ils cliquent Annuler dans la page du fournisseur d'auth social.
quand DEBUG = True
vous serez encore voir la page d'erreur dans votre navigateur pendant le développement.
si vous ne vous souciez pas de gérer l'exception faites ce qui suit dans votre settings.py
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
voir la réponse: comment résoudre une erreur de processus d'authentification annulée?
C'est une mise à jour des importations middleware à l'aide de social_django
from social_django.middleware import SocialAuthExceptionMiddleware
from social_core import exceptions as social_exceptions
from django.shortcuts import HttpResponse
from django.shortcuts import render, redirect
class FacebookAuthCanceledExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return redirect('auth_login')
else:
raise exception