【问题标题】:python-social-auth AuthCanceled exceptionpython-social-auth AuthCanceled 异常
【发布时间】:2014-01-21 08:05:15
【问题描述】:

我在我的 Django 应用程序中使用 python-social-auth 通过 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

有什么方法可以抓住它 Django 吗?

【问题讨论】:

    标签: python django facebook facebook-authentication python-social-auth


    【解决方案1】:

    python-social-authdjango-social-auth 的更新派生版本。

    AlexYar 的answer 可以通过修改settings.py 进行轻微修改以与python-social-auth 一起使用,并进行以下更改:

    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

    【讨论】:

    • 终于找到了适用于新版本的答案!谢谢:)
    • 对我来说关键部分是设置DEBUG = False 这让我发疯了,谢谢你的回答!
    • 谢谢伙计..像魅力一样工作。我真的很感谢stackoverflow。它的魔力!
    【解决方案2】:

    您可以创建一个中间件并捕获任何异常, 例外列表: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', )

    【讨论】:

    • hasattr(social_exceptions, 'AuthCanceled') 即使异常不是 AuthCanceled 也返回 true。它可以捕获所有其他错误,甚至是 404。
    • 注意,如果 INSTALLED_APPS 包含 'debug_toolbar',这将不起作用,因为它包装了中间件并防止异常通过 process_exception 函数渗透
    • 是的,这只是一个例子。
    【解决方案3】:

    这是对@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',
    )
    

    【讨论】:

    • 它的from social_auth.middleware import SocialAuthExceptionMiddleware
    • @Chipmunk 这个答案适用于 python-social-auth ,而不适用于 django-social-auth。
    • 为了清楚起见,最好使用与默认类名 SocialAuthExceptionMiddleware 不同的中间件名称(与导入匹配)
    【解决方案4】:

    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 在开发过程中你仍然会在浏览器中看到错误页面。

    【讨论】:

    • 截至 2020 年,这是正确的答案——已通过 social-auth-app-django 4.0.0 和 Django 3.0 验证
    【解决方案5】:

    只需添加

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

    类似的东西

    LOGIN_ERROR_URL = '/'

    仅此而已 或阅读http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware

    【讨论】:

    • 请注意,这不适用于较新版本的python-social-auth。有关正确方法,请参阅@nattster 的答案。
    【解决方案6】:

    如果您不关心处理异常,请在 settings.py 中执行以下操作

    SOCIAL_AUTH_RAISE_EXCEPTIONS = False

    看到这个答案:How to solve Authentication process canceled error?

    【讨论】:

      【解决方案7】:

      这是一个使用 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
      

      【讨论】:

        猜你喜欢
        • 2019-08-26
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        相关资源
        最近更新 更多