22

Я использую python-social-auth в своем приложении Django для аутентификации через Facebook. Но когда пользователь пытается войти в систему, и когда это было refirected в Facebook приложение страниц нажимает на кнопку «Отмена», появляется следующее исключение:python-social-auth Исключение AuthCanceled

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 

ли какой-нибудь способ, чтобы поймать его Django?

+3

Проверка промежуточного программного обеспечения исключений в приложении, docs: http://psa.matiasaguirre.net/docs/configuration/django.html#exceptions-middleware – omab

ответ

20

вы можете создать промежуточное программное обеспечение и поймать какие-либо исключения, списка исключений: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py в этом случае вашего 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', 
    ) 

 
+7

hasattr (social_exceptions, 'AuthCanceled') возвращает true, даже если исключение не авторизованный. Он улавливает все другие ошибки даже 404. –

+3

Внимание, это не сработает, если INSTALLED_APPS включает в себя «debug_toolbar», поскольку он обертывает промежуточное программное обеспечение и предотвращает переполнение исключений из функций process_exception. – Catskul

+0

Да, это всего лишь пример. –

18

Это небольшая модификация @Nicolas ответа, и это работает для меня.

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

Его 'от social_auth.middleware import SocialAuthExceptionMiddleware' – Chipmunk

+0

@Chipmunk Этот ответ для python-social-auth, а не для django-social-auth. –

+2

Лучше использовать другое имя для промежуточного слоя, чем имя класса по умолчанию SocialAuthExceptionMiddleware для ясности (что соответствует импорту) – Mutant

2

Просто добавьте в

MIDDLEWARE_CLASSES = ( 'social_auth.middleware.SocialAuthExceptionMiddleware', )

и что-то вроде

LOGIN_ERROR_URL = '/'

Это все или читать http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware

+2

Обратите внимание, что это не работает для новой версии python-social-auth'. См. Ответ @ nattster для правильного метода. –

34

python-social-auth является новым, полученным вариантом django-social-auth.

AlexYar-х answer может быть слегка модифицирован для работы с python-social-auth путем изменения settings.py со следующими изменениями:

  1. Добавить промежуточное программное обеспечение для обработки SocialAuthException

    MIDDLEWARE_CLASSES += (
        'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', 
    ) 
    
  2. URL для перенаправления, когда исключение

    SOCIAL_AUTH_LOGIN_ERROR_URL = '/' 
    
  3. Обратите внимание, что вам также необходимо установить

    DEBUG = False 
    

Это все или читать http://python-social-auth.readthedocs.org/en/latest/configuration/django.html#exceptions-middleware

+2

наконец-то ответ, который работает для новой версии!спасибо :) –

+1

Ключевой частью для меня было установить «DEBUG = False». Это заставило меня орехи, спасибо за ответ! – nucklehedd

0

Это обновленное импорт промежуточного слоя с помощью 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

2018 года ответ:

  1. Добавить SocialAuthExceptionMiddleware промежуточное программное обеспечение для вашей конфигурации:

    MIDDLEWARE_CLASSES = [ 
        ... 
        'social_django.middleware.SocialAuthExceptionMiddleware', 
    ] 
    
  2. Set SOCIAL_AUTH_LOGIN_ERROR_URL в вашей конфигурации :

    SOCIAL_AUTH_LOGIN_ERROR_URL = '/login' 
    

Теперь, когда у вас есть DEBUG = False, ваши пользователи будут получать перенаправлены на страницу входа в систему, когда они щелкают отменить в странице социальной поставщика AUTH в.

При DEBUG = True вы по-прежнему увидите страницу с ошибкой в ​​своем браузере во время разработки.

Смежные вопросы