Каждый запрос, отправленный с помощью fetch(), имеет свой куки sessionId, что не позволяет мне отслеживать сессию по всем запросам.

У меня есть приложение react front-end, работающее на localhost:3000, и сервер Django backend, работающий на 127.0.0.1:8000

Я отправляю запрос из функции с помощью fetch(). Использование как widthCredentials, так и Access-Control-Allow-Credentials, вероятно, излишне, но на данный момент я пробую все, что угодно.

        const response = await fetch(url, {
            method: 'POST',
            mode: 'cors',
            credentials: 'include',
            headers: {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Credentials': 'true',
                'withCredentials': 'true',
 
            },
            body: JSON.stringify(data)
        })

В моем бэкенде Django я установил django-cors-headers и установил все настройки правильно AFAIK.

Djang не жалуется ни на один запрос, поэтому я считаю, что моя настройка Django верна. По какой-то причине куки sessionId в каждом запросе разные, поэтому я не могу использовать их для отслеживания сессии в разных запросах. Вместо этого Django создает новую сессию для каждого запроса.

Настройки Django

INSTALLED_APPS = [
    ....
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    "cache-control",
    "pragma",
    "access-control-allow-credentials",
    "withCredentials",
]


# use file to store sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"

SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = "localhost"
SESSION_COOKIE_SECURE = True  # if this is to TRUE cookies dont work propoerly, not sure why
# SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_SAMESITE = 'None'

Похоже, что ваша проблема может быть связана с неправильными настройками SESSION_COOKIE_DOMAIN и SESSION_COOKIE_PATH. Вот несколько шагов, чтобы исправить это:

  1. SESSION_COOKIE_DOMAIN:

    • Для локальной разработки следует оставить этот параметр пустым или установить его в значение None. Установка значения "localhost" обычно неверна, поскольку файлы cookie, установленные для "localhost", могут быть не приняты браузером.
  2. SESSION_COOKIE_PATH:

    • Это значение должно быть установлено в "/", если только ваше веб-приложение не размещено по определенному пути.
  3. Другие настройки:

    • Убедитесь, что 'django.contrib.sessions' находится в вашем INSTALLED_APPS и 'django.contrib.sessions.middleware.SessionMiddleware' находится в вашем MIDDLEWARE.

Вот измененная конфигурация для ваших настроек Django:

Настройки Django

INSTALLED_APPS = [
    ....
    'corsheaders',
    'django.contrib.sessions',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
]

CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    "cache-control",
    "pragma",
    "access-control-allow-credentials",
    "withCredentials",
]

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"

SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = None  # For local development
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_SECURE = False  # Should be False for local development
SESSION_COOKIE_SAMESITE = 'None'
Вернуться на верх