最近、Cookieドメイン(settings.SESSION_COOKIE_DOMAIN)をdomain.comから.domain.comに変更しました。これにより、SafariユーザーがCookieをクリアしない限りログインできなくなります。この問題は、両方のドメインにセッションIDCookieが設定されているという事実に起因しています。
元のドメインをクリアまたは無視する方法はありますか、それともユーザーにCookieをクリアするようにアドバイスする唯一の方法ですか?
これは、SESSION_COOKIE_DOMAIN
設定が変更されたときに発生する可能性があります。(あなたはそれSESSION_COOKE_PATH
が変更されたと述べました)。
のドキュメントには、次のSESSION_COOKIE_DOMAIN
警告が付属しています。
SESSION_COOKIE_DOMAIN
実稼働サイトでこの設定を更新するときは注意してください。この設定を更新して、以前に標準ドメインCookieを使用していたサイトでクロスドメインCookieを有効にすると、既存のユーザーCookieが古いドメインに設定されます。これにより、これらのCookieが存続している限り、ログインできなくなる可能性があります。
これは、次の場所から行った場合に発生します。
SESSION_COOKIE_DOMAIN = None
に
SESSION_COOKIE_DOMAIN = '.domain.com'
おっしゃるように、クライアント側には2つのCookieがあり、リクエスト中にサーバーに送信されます。両方のCookieの名前はsessionid
です。DjangoがCookieを確認する場合、Pythonディクショナリにしかアクセスできないため、sessionid
送信されたCookieの両方ではなく、1つのCookieのみが表示されます。
私はこれをテストしていませんが、問題を修正するためのいくつかのアイデアは次のとおりです。
適切なCookieを削除するようにユーザーに依頼します。ユーザーの数とそのスキルレベルによっては、これは合理的なオプションではない場合があります。すべてのCookieを削除するように依頼することは問題外かもしれません。
古いCookieの有効期限が切れるのを待ちます。デフォルトでは、sessionid
Cookieの有効期限は14日であるかのように見えます。古いセッションCookieの有効期限が切れると、リクエストごとにCookieが送信されなくなり、新しいsessionid
Cookieが有効になります。
Cookieの名前を変更し、sessionid
古いCookieと新しいsessionid
Cookieの両方を処理するカスタムDjangoミドルウェアを作成します。
最後のポイントはテストしていませんが、SESSION_COOKIE_NAME
を以外のものに変更できるはずですsessionid
。これにより、既存のログインユーザーが既存のCookieを使用できなくなるため、 Cookie(古いCookieの場合)と現在のログオンのCookieのsessionid
両方を処理できるカスタムミドルウェアを作成する必要があります。sessionid
sessionidnew
このようなものが機能します:
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)
inunderをこの新しいミドルウェアSessionMiddleware
に置き換える必要があります。例:custommiddleware.pyが上記のコードを含むファイルであり、プロジェクトのルートフォルダーに存在する場所(manage.pyファイルが存在する場所)に変更します。settings.py
MIDDLEWARE_CLASSES
'django.contrib.sessions.middleware.SessionMiddleware'
'custommiddleware.MySessionMiddleware'
十分な時間が経過し、すべての古いCookieの有効期限が切れたことに満足しsessionid
たら、逆の操作を行って、セッションの優先Cookie名として使用するように戻し、最終的に2つの異なるタイプのCookiesessionid
を処理できるスペシャリストコードを削除できます。sessionid
。