Каждый запрос, отправленный с помощью 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
. Вот несколько шагов, чтобы исправить это:
SESSION_COOKIE_DOMAIN:
- Для локальной разработки следует оставить этот параметр пустым или установить его в значение
None
. Установка значения"localhost"
обычно неверна, поскольку файлы cookie, установленные для"localhost"
, могут быть не приняты браузером.
- Для локальной разработки следует оставить этот параметр пустым или установить его в значение
SESSION_COOKIE_PATH:
- Это значение должно быть установлено в
"/"
, если только ваше веб-приложение не размещено по определенному пути.
- Это значение должно быть установлено в
Другие настройки:
- Убедитесь, что
'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'