Django的Python Social Auth引发了Authforbidden异常

时间:2017-06-09 15:21:47

标签: python django authentication social google-login

我正在使用Django 1.10和python 2.7以及social-auth-app-django(1.2.0)。它是Python Social Auth库的一部分。

我希望将登录限制为仅限我公司的域名ID,因此我从库中使用了此设置。

SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS=['mycompany.in']

现在,如果您尝试按预期登录任何其他域,则会抛出错误。

我的目标是捕获此异常并向用户显示自定义页面。但是对于我的生活,我无法这样做。

如果我将Debug设置为False,则会将用户重定向到我的

LOGIN_ERROR_URL='/'

页面但无法将自定义消息传递给用户

这是我的setting.py

的一部分

DEBUG = False

    MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'social_django.middleware.SocialAuthExceptionMiddleware',
]

#social auth
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY= "9******6.apps.googleusercontent.com"
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET="W*****x"
SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS=['mycompany.in']
LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'upload_file'
LOGOUT_URL = 'logout'
LOGIN_ERROR_URL='logout

在我看来,我有这个代码来处理异常

from social_django.middleware import SocialAuthExceptionMiddleware
from social_core.exceptions import AuthForbidden


    class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
      def process_exception(self, request, exception):
        print "exception occured"
        if hasattr(social_exceptions, 'AuthForbidden'):
          print "hello two"
          return HttpResponse("I'm a exception %s" % exception)
        else:
          print "other exception"
          raise exception

我甚至尝试过

def process_template_response(self):
    print "response"'

def get_redirect_uri(request, exception):
    print "URL"

但无济于事。

我已经关注了这些链接 python-social-auth AuthCanceled exception

http://python-social-auth-docs.readthedocs.io/en/latest/configuration/django.html#exceptions-middleware

当debug设置为False时,这是输出:

  

“/ app / oauth / complete / google-oauth2 /的AuthForbidden   您的凭据不允许“

1 个答案:

答案 0 :(得分:4)

  1. 需要在settings.py
  2. 中设置SOCIAL_AUTH_LOGIN_ERROR_URL的值
  3. 扩展SocialAuthExceptionMiddleware类&需要覆盖“get_message”方法
  4. 处理错误URL将消息显示给用户。
  5. 例如

    <强> Middleware.py

    from social_django.middleware import SocialAuthExceptionMiddleware
    
    class CustomSocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
        def get_message(self, request, exception):
           default_msg = super(CustomSocialAuthExceptionMiddleware).get_message(request, exception) # in case of display default message
           return "Custom messages text write here."
    

    <强> settings.py

    SOCIAL_AUTH_LOGIN_ERROR_URL = '/error_page/'
    MIDDLEWARE = [
    '...',
    'path.to.custom.middleware.CustomSocialAuthExceptionMiddleware',
    ]
    

    <强> URL.py

    from django.conf.urls import url
    
    from views import ErrorPage
    
    urlpatterns = [
        url(r'^error_page/$', ErrorPage.as_view(), name="error-page"),
    ]
    

    <强> view.py

    from django.views.generic.base import TemplateView
    
    class ErrorPage(TemplateView):
        template_name = 'error.html'
    

    <强>的error.html(模板)

    ....
       <body>
         {% if messages %}
            <ul class="messages">
               {% for message in messages %}
                   <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }} </li>
            {% endfor %}
            </ul>
        {% endif %}
       </body>
    ....
    

    如果您正在使用django消息框架。如果不使用django消息框架,中间件将消息添加到GET参数中,您可以在错误页面上显示。