【问题标题】:Python Social Auth for Django raises Authforbidden exceptionDjango 的 Python Social Auth 引发 Authforbidden 异常
【发布时间】:2017-11-11 16:31:50
【问题描述】:

我将 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='/'

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

这是我设置的一部分。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

这是调试设置为 False 时的输出:

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

【问题讨论】:

    标签: python django authentication social google-login


    【解决方案1】:
    1. 需要在settings.py中为SOCIAL_AUTH_LOGIN_ERROR_URL设置值
    2. 扩展 SocialAuthExceptionMiddleware 类并需要覆盖“get_message”方法
    3. 处理错误 URL 向用户显示消息。

    例如

    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参数中,您可以在错误页面上显示。

    【讨论】:

    • 您好,谢谢您的回答。但它似乎只部分起作用。我完全按照说明进行操作,我在重载方法中添加的打印语句执行,因此控件进入方法内部,但随后重定向失败 (SOCIAL_AUTH_LOGIN_ERROR_URL="error-page") 。相反,我收到“服务器错误(500)”但是如果我删除中间件,那么重定向就会起作用。但是后来我没有重载的方法。
    • 好的,所以我在删除声明 default_msg = super(CustomSocialAuthExceptionMiddleware).get_message(request, exception) 后能够完成这项工作不知道声明 @kaushal 的问题是什么,请您解释一下这个特定声明失败的原因?收到的错误是Server Error (500)
    • @ShaikhSaleem 服务器错误 (500) 是非常一般的错误。很难知道哪个语句导致错误。请查看回溯。(在本地开发中确保在 settings.py 中 debug=True 以查看完整的回溯,否则只会显示服务器错误(500))您可能会得到线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2013-10-18
    相关资源
    最近更新 更多