Python Social Auth for Django引发了Authforbidden异常

6
我正在使用Python 2.7的Django 1.10和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时的输出:

"AuthForbidden at /app/oauth/complete/google-oauth2/ 您的凭据不被允许"

1个回答

5
  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(template)

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

你好,感谢你的回答。但似乎只有部分起作用。我完美地按照指示操作了,我在重载方法中添加的print语句执行了,所以控制权进入了方法,但是重定向失败 (SOCIAL_AUTH_LOGIN_ERROR_URL="error-page") 。相反,我收到一个 'Server Error (500)' 但是,如果我删除中间件,那么重定向就会起作用。但是这样我就没有重载方法了。 - Shaikh Saleem
好的,我在删除语句 default_msg = super (CustomSocialAuthExceptionMiddleware) .get_message(request, exception) 后使它正常工作了。不确定这个语句有什么问题 @kaushal ,您能解释一下这个语句失败的原因吗?收到的错误是 “服务器错误(500)”。 - Shaikh Saleem
@ShaikhSaleem 服务器错误(500)是非常通用的错误。很难知道哪个语句导致了错误。请查看回溯。(在本地开发中,请确保在settings.py中debug=True以查看完整的回溯,否则只会显示服务器错误(500))。您可能会得到线索。 - Kaushal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接