Токен csrf администратора Django не установлен
У меня есть проект Django, работающий локально, с работающим входом на портал администратора. После развертывания проекта в нашей среде разработки страницы, не требующие CSRF-аутентификации, доступны для просмотра, но портал администратора возвращает ошибку CSRF-токена при попытке входа.
Получена ошибка: CSRF cookie not set
Проект должен быть развернут на поддомене (т.е. https://project.myapp.com), а версия разработки/программы развернута на другом поддомене (https://project.dev.myapp.com).
Подмножество settings.py:
ALLOWED_HOSTS = ['*']
CSRF_COOKIE_SECURE = False
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.gis',
'django.contrib.messages',
'django.contrib.sessions',
'django.contrib.staticfiles',
'django_object_actions',
]
MIDDLEWARE = (
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
Первоначально я предположил, что проблема связана с тем, что проект развернут на поддомене, и, следуя документации по csrf, добавил CSRF_TRUSTED_ORIGINS = ['https://*.myapp.com']
в настройки, но проблема сохраняется.
Я также попробовал установить настройку CSRF_COOKIE_DOMAIN
на .myapp.com
или .dev.myapp.com
, но продолжаю наблюдать ту же проблему.
Я также видел, что люди упоминали django.template.context_processors.csrf
возможность добавить в TEMPLATES контекст_процессоров, и попробовал это, но это также не дало никакого эффекта.
При просмотре запроса к представлению /admin/login включается csrfmiddlewaretoken
, но в браузере ничего не устанавливается.
Может быть, я упускаю какую-то другую настройку?
P.S. Установка выполняется с uwsgi за nginx, но поскольку все страницы по-прежнему обслуживаются правильно, я (возможно, ошибочно) предполагаю, что проблема не в этом.
Возможно, вы могли бы сделать так, чтобы флаги SESSION_COOKIE_SECURE
и CSRF_COOKIE_SECURE
совпадали. Вы установили флаг CSRF_COOKIE_SECURE = False
. Если SESSION_COOKIE_SECURE
равен True, то это может быть причиной проблемы. Вам следует либо установить оба флага в значение False во время разработки, либо установить их оба в значение True для производственной среды HTTPS.
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
Для CSRF Cookie Domain, когда вы переходите на новый поддомен, точка .
в начале имеет решающее значение. Это гарантирует, что все субдомены будут включены.
CSRF_COOKIE_DOMAIN = '.myapp.com'
И, возможно, будет полезно убедиться, что ваша конфигурация NGINX по какой-то причине не удаляет заголовок "Cookie". Механизм CSRF Token в Django работает путем сравнения значения, хранящегося в куках вашей сессии, со значением, отправленным в скрытое поле формы или HTTP-заголовок. Если ваша конфигурация NGINX неправильно пересылает заголовок Cookie, это может быть причиной проблемы.
На самом деле проблема заключалась в самом развертывании. Сервер находится за дистрибутивом AWS cloudfront, который не передавал заголовок cookie на сервер. Комментарий @malvin о регистрации cookie в логах NGINX привел к открытию.