Как задать подстановочный знак для CSRF_TRUSTED_ORIGINS в Django?
После обновления с Django 2 до Django 4.0.1 я получаю ошибки CSRF на все POST запросы. Журналы показывают:
"WARNING:django.security.csrf:Forbidden (Origin checking failed - https://127.0.0.1 does not match any trusted origins.): /activate/"
Я не могу понять, как задать подстановочный знак для CSRF_TRUSTED_ORIGINS? У меня есть сервер, отправляемый клиентам, которые размещают его на своем собственном домене, поэтому у меня нет возможности определить его происхождение заранее. Я пробовал следующее, но безуспешно:
CSRF_TRUSTED_ORIGINS = ["https://*", "http://*"]
и
CSRF_TRUSTED_ORIGINS = ["*"]
Явная установка "https://127.0.0.1" в CSRF_TRUSTED_ORIGINS работает, но не будет работать в производственном развертывании моего клиента, который получит другое имя хоста.
Да, он изменился в версии 4.0, как вы можете увидеть здесь здесь
Изменения в Django 4.0:
Значения в старых версиях должны включать только имя хоста (возможно, с ведущей точкой), а не схему или звездочку.
Кроме того, в старых версиях не выполняется проверка заголовков Origin.
Примечание: вы не должны использовать *
в производстве.
Приложение Django работает с использованием Gunicorn за NGINX. Поскольку SSL прекращается после того, как NGINX request.is_secure() возвращает false, что приводит к тому, что заголовок Origin не соответствует хосту здесь:
Я решил эту проблему, добавив в Django следующее:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
И убедился, что NGINX пересылает схему http со следующим в моем NGINX conf:
proxy_set_header X-Forwarded-Proto $scheme;