跳转到主要内容

Django跨多域名运行同一应用时的会话共享

项目描述

django-shared-session

django-shared-session是一个允许跨站会话共享的工具,这在运行在不同域名上的同一Django应用中很有用(例如,由于不同的语言突变)。此库可以用于共享登录信息以及认证和匿名用户的会话数据。如果您只需要共享登录信息,请考虑使用一些单点登录(SSO)解决方案,这可能会更适合此特定用例。

此工具仅在您在多个域名上运行应用程序时才有用,而不仅仅是子域名。子域名可以通过设置cookie路径为.domain.tld(以点开头)来处理。

本项目受django-xsession的启发,但使用不同的会话共享方法,即在服务器端设置cookie,因此无需重新加载页面。

工作原理

  1. 用户访问已配置的网站之一
  2. 会话密钥被加密并包含在HTML文件中。该文件包含<script>标签,链接到所有配置的网站,并包含加密的会话密钥(作为文件名的一部分)。
  3. 浏览器请求脚本文件
  4. 在目标域名上,会话密钥从有效载荷中解密并保存到cookie中

示例HTML片段

<script src="http://www.example.org/shared-session/9x7JV1xWFAk8nWhORGCkO5O4zUSjVCR-2abQh7AnFRckiwk8adn6PVlCsdqX4SaTY2dde7S3YuM0ZchKsCuZZiYSZwVLtOA5IoUJRHDl74s4uBYQERQQQMh6T48WD883cFvAaI0XVKB1d5YVtZ7st7GIfxUv2kw6JqftQnFb7uhAOtbTrbdsVWdJEQYdBbweoQPRm9BiRodpk8oo6gpKKC434jPLnJX4-B31KhessmVrgC6_7AOjyZUypC52JXAEjZQm.js" async></script>
<script src="http://www.another-domain.org/shared-session/v_artye4YSMnbbqrrBzUqmIIBFArsMRIkH9vIBNqiEM3uMJQF2RMJtLifIaehbMxRG-ChyMB3gDyLTGmbtCOhs1ODcFAy0PdekJHlSoLR3xezvDCld0YBbfDoOQFVqPeTavHx2uF7X-6A5bWRtV19hg5kI4uFDKWHATCxm2EdXZPrkN23nX_2-PUfCufAQR3vJeJQRjSzj-FfX-qK9xxAeL1-rvUwJvb2bCvoqL0gCTMNBMSeXLMkjjlpXmmlAfGeU3C.js" async></script>

包含会话密钥、时间戳、源和目标主机名的加密有效载荷(以base64编码)是文件名本身的一部分。目标服务器检查时间戳以防止重放攻击。

安装

pip install django-shared-session

此工具访问模板内的请求,请确保您在模板的引擎上下文中启用了RequestContext

使用方法

shared_session添加到INSTALLED_APPS,并在Django设置文件中设置共享会话域名。然后,将shared_session.urls添加到您的urlconf中。

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ...
    'shared_session'
]

SHARED_SESSION_SITES = ['www.example.com', 'www.example.org']

urls.py

import shared_session

urlpatterns = [
    url(r'^shared-session/', shared_session.urls),  # feel free to change the base url
]

为了与配置的站点共享会话,您还需要在基本模板中使用{% shared_session_loader %}

layout.html

{% load shared_session %}

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        {% shared_session_loader %}
    </head>
    <body>
        
    </body>
</html>

如果您还想在Django管理界面中共享会话,可以覆盖admin/base_site.html并包含加载器。

高级选项

SHARED_SESSION_ALWAYS_REPLACE – 总是替换会话cookie,即使会话不为空。(默认:False)SHARED_SESSION_TIMEOUT – 过期超时。会话需要在指定时间前发送到目标站点。(默认:30)

信号

当目标站点的会话cookie被更改或创建时,会触发信号session_replaced。您可以将自己的处理程序连接到运行附加函数。

from shared_session import signals
import logging

def log_session_replace(sender, **kwargs):
    logging.info('%s session replaced' % kwargs.get('dst_domain'))

signals.session_replaced.connect(log_session_replace)

许可证

本软件根据MPL 2.0许可。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-shared-session-0.5.3.tar.gz (6.1 kB 查看哈希)

上传时间:

由以下组织支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误记录StatusPageStatusPage状态页