it-roy-ru.com

исключение python-social-auth AuthCanceled

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

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

Есть ли способ поймать это Джанго?

25
vero4ka

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

python-social-auth - это более новая производная версия Django-social-auth

AlexYar's 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

38
nattster

Это небольшая модификация ответа @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',
)
18
Ryu_hayabusa

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

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

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

LOGIN_ERROR_URL = '/'

Это все Или прочитайте http://Django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware

2
AlexYar

Ответ 2018 года:

  1. Добавьте SocialAuthExceptionMiddleware промежуточное ПО в вашу конфигурацию:

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

    SOCIAL_AUTH_LOGIN_ERROR_URL = '/login'
    

Теперь, когда у вас есть DEBUG = False, ваши пользователи будут перенаправлены на вашу страницу входа в систему, когда они нажмут кнопку «Отмена» на странице поставщика социальной аутентификации.

Когда DEBUG = True, вы все равно увидите страницу ошибки в вашем браузере во время разработки.

1
Babken Vardanyan

Если вы не заботитесь об обработке исключения, сделайте следующее в своем settings.py

SOCIAL_AUTH_RAISE_EXCEPTIONS = False

Смотрите этот ответ: Как решить процесс проверки подлинности отменена ошибка?

0
Staccato

Это обновленное промежуточное ПО для импорта, использующее 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
Jonathan Ferreyra