使用Django中的自定义中间件跨不同顶级域共享会话

时间:2019-03-21 03:50:49

标签: django authentication cross-domain session-cookies

使用一个django项目,我有3个不同的TLD。为了帮助处理多个域,我使用了django-hosts。就网站的内容和功能而言,有一个工作人员网站(staff.com)被发布者专门用于发布和管理内容,尽管它更加友好,但基本上类似于管理网站。然后有2个不同的客户网站,例如musicstuff.com和videotuff.com。这两个共享了两个应用程序,例如博客,论坛,内容页面等。由于所有3个站点都使用不同的域,因此我必须找到一种处理会话的方法。它需要一个登录页面,并且能够在所有站点及其各自的子域之间共享cookie。我有以下自定义中间件:

from django.conf import settings

class CrossDomainSessionMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        response = self.get_response(request)

        if response.cookies:
            host = request.get_host()

            if host not in settings.SESSION_COOKIE_DOMAIN:

                if host in settings.ALLOWED_HOSTS:

                    domain = '{domain}'.format(domain=host)

                    for cookie in response.cookies:
                        if 'domain' in response.cookies[cookie]:
                            response.cookies[cookie]['domain'] = domain

        return response

目标是将Cookie中的域替换为所使用网站中的域,该域必须在设置的ALLOWED_HOSTS中列出。

现在,这是其中的一个怪异部分:我开始研究网站的结构,并将用户和会话留给以后使用。最初,在实现该自定义中间件之前,我遇到的问题是django messages仅在人员站点上显示,而在内容站点上却没有显示。消息似乎依赖于设置在工作人员网站上的SESSION_COOKIE_DOMAIN。实施自定义中间件后,消息也开始出现在内容站点上。我以为这也可以解决跨域身份验证问题,但事实并非如此。那么,为什么使用此替代方法而不是通过身份验证就能使邮件起作用?

0 个答案:

没有答案
相关问题