如何在Django中清除旧SESSION_COOKIE_DOMAIN的cookie

jor*_*llo 5 django cookies session

我们最近将我们的Cookie域名(settings.SESSION_COOKIE_DOMAIN)从domain.com更改为.domain.com,现在这阻止了Safari用户登录,除非他们清除了Cookie.问题在于为两个域设置了sessionid cookie.

有没有办法清除或忽略原始域或是建议用户清除cookie的唯一方法?

Aus*_*ips 9

SESSION_COOKIE_DOMAIN修改设置时可能会发生这种情况.(你声明SESSION_COOKE_PATH已经改变了).

SESSION_COOKIE_DOMAIN随附此警告的文档:

SESSION_COOKIE_DOMAIN

在生产站点上更新此设置时要小心.如果更新此设置以在以前使用标准域cookie的站点上启用跨域cookie,则现有用户cookie将设置为旧域.这可能导致只要这些cookie持续存在就无法登录.

如果你从以下地方出现这种情况:

SESSION_COOKIE_DOMAIN = None
Run Code Online (Sandbox Code Playgroud)

SESSION_COOKIE_DOMAIN = '.domain.com'
Run Code Online (Sandbox Code Playgroud)

如您所述,客户端现在有两个cookie,它们将在请求期间发送到服务器,并且两个cookie都被命名sessionid.当Django查看cookie时,它只能访问Python字典,所以它只能看到一个sessionidcookie而不是两个cookie.

我没有对此进行测试,但解决问题的一些想法可能是:

  • 要求用户删除相应的cookie.根据用户数量及其技能水平,这可能不是一个合理的选择.要求他们删除所有他们的cookie可能是不可能的.

  • 等待旧cookie过期.默认情况下,sessionidcookie似乎有14天的到期时间.旧会话cookie过期后,将不再随每个请求一起发送,允许新sessionidcookie生效.

  • 更改sessionidcookie 的名称并编写自定义Django中间件来处理新旧sessionidcookie.

我没有测试过最后一点,但应该可以将其更改SESSION_COOKIE_NAME为其他内容sessionid.现在,这将阻止现有登录用户使用他们现有的sessionidcookie,因此您需要编写一个自定义中间件,它能够处理sessionidcookie(对于旧cookie)和sessionidnew当前登录的cookie.

这样的东西会起作用:

from django.utils.importlib import import_module
from django.contrib.sessions import middleware
from django.conf import settings

class MySessionMiddleware(middleware.SessionMiddleware):
    def process_request(self, request):
        engine = import_module(settings.SESSION_ENGINE)
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        if session_key is None:
            # Look for old cookie in request for auth purposes.
            session_key = request.COOKIES.get('sessionid', None)
        request.session = engine.SessionStore(session_key)
Run Code Online (Sandbox Code Playgroud)

你必须更换SessionMiddlewaresettings.py根据MIDDLEWARE_CLASSES这个新的中间件.例如:更改'django.contrib.sessions.middleware.SessionMiddleware''custommiddleware.MySessionMiddleware'custommiddleware.py是具有上述代码的文件,并且存在于项目根文件夹中(其中存在manage.py文件)

一旦经过足够的时间并且您对所有旧sessionidcookie已过期感到满意,您可以反过来并改回使用sessionid作为会话的首选cookie名称,最终删除可处理两种不同类型sessionidcookie 的专业代码.