python - social_django - social auth django google
python-social-auth AuthCanceled excepción (7)
Estoy usando python-social-auth en mi aplicación Django para la autenticación a través de Facebook. Pero cuando un usuario intenta iniciar sesión y cuando se ha vuelto a dirigir a la página de la aplicación de Facebook, hace clic en el botón "Cancelar", aparece la siguiente excepción:
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
¿Hay alguna manera de atraparlo Django?
Esta es una ligera modificación de la respuesta de @Nicolas y esto funciona para mí.
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'',
)
Este es un middleware actualizado de importaciones usando 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
La respuesta de 2018:
Agregue middleware
SocialAuthExceptionMiddleware
a su configuración:MIDDLEWARE_CLASSES = [ ... ''social_django.middleware.SocialAuthExceptionMiddleware'', ]
Establezca
SOCIAL_AUTH_LOGIN_ERROR_URL
en su configuración:SOCIAL_AUTH_LOGIN_ERROR_URL = ''/login''
Ahora, cuando tenga DEBUG = False
, sus usuarios serán redirigidos a su página de inicio de sesión cuando hagan clic en cancelar en la página del proveedor de autenticación social.
Cuando DEBUG = True
aún verá la página de error en su navegador durante el desarrollo.
Si no le importa manejar la excepción, haga lo siguiente en su settings.py
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
Ver esta respuesta: ¿Cómo resolver el proceso de autenticación cancelado error?
Solo añade
MIDDLEWARE_CLASSES = (''social_auth.middleware.SocialAuthExceptionMiddleware'',)
y algo como
LOGIN_ERROR_URL = ''/''
Eso es todo o lea http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
puede crear un middleware y capturar cualquier excepción, lista de excepciones: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py en este caso, su excepción AuthCanceled.
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
es una versión más nueva, derivada de django-social-auth
.
La answer de AlexYar se puede modificar ligeramente para que funcione con python-social-auth
modificando settings.py
con los siguientes cambios:
Agrega un middleware para manejar la excepción SocialAuthException
MIDDLEWARE_CLASSES += ( ''social.apps.django_app.middleware.SocialAuthExceptionMiddleware'', )
URL para redirigir a, cuando se produjo una excepción
SOCIAL_AUTH_LOGIN_ERROR_URL = ''/''
Tenga en cuenta que también necesita configurar
DEBUG = False
Eso es todo o lea http://python-social-auth.readthedocs.org/en/latest/configuration/django.html#exceptions-middleware