Django跨多域名运行同一应用时的会话共享
项目描述
django-shared-session
django-shared-session是一个允许跨站会话共享的工具,这在运行在不同域名上的同一Django应用中很有用(例如,由于不同的语言突变)。此库可以用于共享登录信息以及认证和匿名用户的会话数据。如果您只需要共享登录信息,请考虑使用一些单点登录(SSO)解决方案,这可能会更适合此特定用例。
此工具仅在您在多个域名上运行应用程序时才有用,而不仅仅是子域名。子域名可以通过设置cookie路径为.domain.tld
(以点开头)来处理。
本项目受django-xsession的启发,但使用不同的会话共享方法,即在服务器端设置cookie,因此无需重新加载页面。
工作原理
- 用户访问已配置的网站之一
- 会话密钥被加密并包含在HTML文件中。该文件包含
<script>
标签,链接到所有配置的网站,并包含加密的会话密钥(作为文件名的一部分)。 - 浏览器请求脚本文件
- 在目标域名上,会话密钥从有效载荷中解密并保存到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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 693097f7dafcaa909e106671d0b8c9bcaa484136ad7810c01585c04e7596768e |
|
MD5 | 5b1f1cbdc019c2d50c767347fc011e42 |
|
BLAKE2b-256 | 27f12cc031c745f9cc467d6d158efc00f278d90a79905daa69c1fe66cc41ff48 |