7

最近、Cookieドメイン(settings.SESSION_COOKIE_DOMAIN)をdomain.comから.domain.comに変更しました。これにより、SafariユーザーがCookieをクリアしない限りログインできなくなります。この問題は、両方のドメインにセッションIDCookieが設定されているという事実に起因しています。

元のドメインをクリアまたは無視する方法はありますか、それともユーザーにCookieをクリアするようにアドバイスする唯一の方法ですか?

4

1 に答える 1

12

これは、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の有効期限が切れるのを待ちます。デフォルトでは、sessionidCookieの有効期限は14日であるかのように見えます。古いセッションCookieの有効期限が切れると、リクエストごとにCookieが送信されなくなり、新しいsessionidCookieが有効になります。

  • Cookieの名前を変更し、sessionid古いCookieと新しいsessionidCookieの両方を処理するカスタムDjangoミドルウェアを作成します。

最後のポイントはテストしていませんが、SESSION_COOKIE_NAMEを以外のものに変更できるはずですsessionid。これにより、既存のログインユーザーが既存のCookieを使用できなくなるため、 Cookie(古いCookieの場合)と現在のログオンのCookieのsessionid両方を処理できるカスタムミドルウェアを作成する必要があります。sessionidsessionidnew

このようなものが機能します:

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.pyMIDDLEWARE_CLASSES'django.contrib.sessions.middleware.SessionMiddleware''custommiddleware.MySessionMiddleware'

十分な時間が経過し、すべての古いCookieの有効期限が切れたことに満足しsessionidたら、逆の操作を行って、セッションの優先Cookie名として使用するように戻し、最終的に2つの異なるタイプのCookiesessionidを処理できるスペシャリストコードを削除できます。sessionid

于 2013-03-27T00:49:37.823 に答える