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?

25
demandé sur vero4ka 2014-01-03 19:39:02

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',
    )


21
répondu Nicolás 2016-05-02 11:50:11

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:

  1. Ajouter un middleware pour gérer la SocialAuthException" 15198090920"

    MIDDLEWARE_CLASSES += (
        'social.apps.django_app.middleware.SocialAuthExceptionMiddleware',
    )
    
  2. URL de redirection, lorsqu'une exception s'est produite

    SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
    
  3. 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

38
répondu nattster 2017-05-23 11:54:18

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',
)
18
répondu Ryu_hayabusa 2014-03-05 09:27:16

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

2
répondu AlexYar 2014-02-27 05:36:14

la réponse de 2018:

  1. ajouter SocialAuthExceptionMiddleware middleware à votre configuration:

    MIDDLEWARE_CLASSES = [
        ...
        'social_django.middleware.SocialAuthExceptionMiddleware',
    ]
    
  2. 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.

1
répondu Babken Vardanyan 2018-01-29 14:12:14

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?

0
répondu Staccato 2017-05-23 11:46:38

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
0
répondu Jonathan Ferreyra 2017-11-30 14:44:54