簡體   English   中英

python-social-auth AuthCanceled 異常

[英]python-social-auth AuthCanceled exception

我在我的 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-social-authdjango-social-auth的更新派生版本。

AlexYar 的答案可以通過修改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

您可以創建一個中間件並捕獲任何異常,異常列表: https : //github.com/omab/python-social-auth/blob/master/social/exceptions.py在這種情況下您的 AuthCanceled 異常。

中間件.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

設置.py



MIDDLEWARE_CLASSES = (
        .....
        'pat_to_middleware.SocialAuthExceptionMiddleware',
)

這是@Nicolas 答案的輕微修改,這對我有用。

中間件.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

設置.py

MIDDLEWARE_CLASSES += (
'myapp.middleware.SocialAuthExceptionMiddleware',
)

只需添加

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

和類似的東西

LOGIN_ERROR_URL = '/'

這就是全部或閱讀http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware

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您仍會在開發過程中在瀏覽器中看到錯誤頁面。

如果您不關心處理異常,請在settings.py執行以下操作

SOCIAL_AUTH_RAISE_EXCEPTIONS = False

請參閱此答案: 如何解決身份驗證過程取消錯誤?

這是使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM