React Django Auth
Я пытаюсь войти в систему через приложение ReactJS и вот какая ошибка возникает:
Доступ к XMLHttpRequest на 'http://localhost:8000/auth/login/' от origin 'http://localhost:3000' был заблокирован политикой CORS: Ответ на предварительный запрос не проходит проверку контроля доступа: The значение заголовка 'Access-Control-Allow-Credentials' в ответе '', которое должно быть 'true', когда режим мандатов запроса является 'include'. Режим учетных данных запросов, инициированных с помощью XMLHttpRequest, контролируется атрибутом withCredentials.
.
хотя я добавил CORS_ALLOW_CREDENTIALS: True
к settings.py
:
А вот запрос Axios:
axios.post('http://localhost:8000/auth/login/', {username: username, password:password}, {withCredentials: true})
.then(r => {console.log(r)})
.catch(function (error) {
console.log(error)
});
Вы написали MIDDLEWARE в неправильном порядке, правильный порядок в вашем случае будет
`MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
"corsheaders.middleware.CorsMiddleware",
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]`
Вот как можно решить эту проблему с помощью django-cors-headers
Установите его в env :
.pip install django-cors-headers
Настройте параметры
.
Добавьте
corsheaders
в INSTALLED_APPS
Добавьте
CorsMiddleware
надCommonMiddleWare
вMIDDLEWARE
Создать
CORS_ORIGIN_WHITELIST
Пример:
INSTALLED_APPS = [
...
'rest_framework',
'corsheaders',
...
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# Others middleware here
]
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000', # For react front end
'http://localhost:8000', # For Django
)
NB : Очень важно, чтобы corsheaders.middleware.CorsMiddleware
появлялся в правильном месте. То есть выше django.middleware.common.CommonMiddleware
в настройке MIDDLEWARE
поскольку middlewares
загружаются сверху вниз.
Также обратите внимание, что мы внесли в белый список два домена:
localhost:3000
и localhost:8000
. Первый - это порт по умолчанию для React, который мы будем использовать для нашего фронтенда. Второй - это порт по умолчанию для Django.
После потраченных часов и часов это оказалось глупой ошибкой, которую я совершал:
CORS_ALLOW_CREDENTIALS: True
Вместо:
CORS_ALLOW_CREDENTIALS = True