Проверка CSRF не работает в Django с использованием HTTPS

Я разрабатываю приложение, интерфейс которого представляет собой AngularJS API, который выполняет запросы к внутреннему API, разработанному в Django Rest Framework.

The frontend is on the domain: https://front.bluemix.net
And my backend is on the domain: https://back.bluemix.net

У меня проблемы с отправкой запросов из интерфейсного API в серверный API. Ошибка такая:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

Я использую CORS и уже включил следующие строки в свой файл settings.py в API серверной части Django:

ALLOWED_HOSTS = []

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True


CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']

CORS_REPLACE_HTTPS_REFERER = True

CSRF_COOKIE_DOMAIN = 'bluemix.net'

CORS_ORIGIN_WHITELIST = (
    'https://front.bluemix.net/',
    'front.bluemix.net',
    'bluemix.net',
)

Кто-нибудь знает, как решить эту проблему?


person ccr    schedule 09.08.2016    source источник
comment
Вы выполнили все шаги, указанные в github.com/ottoyiu/django-cors-headers?   -  person wilcus    schedule 09.08.2016
comment
Да! Ошибка такая же ...   -  person ccr    schedule 09.08.2016
comment
Возможно, ваша версия django не поддерживается. Попробуйте эту вилку github.com/zestedesavoir/django-cors-middleware   -  person wilcus    schedule 09.08.2016


Ответы (2)


Ваша CSRF_TRUSTED_ORIGINS настройка неверна - измените ее на:

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']

Для настройки требуется только имя хоста, а не схема. . В любом случае схема является избыточной, потому что параметр имеет значение только при подключении через HTTPS.

Вам, наверное, тоже нужно что-то вставить в _3 _...

person solarissmoke    schedule 09.08.2016
comment
Спасибо, проблема была в CSRF_TRUSTED_ORIGINS. Теперь работает как шарм :) - person ccr; 09.08.2016
comment
Спасибо, мой друг. У меня была такая же проблема, и теперь она решена !! - person WitnessTruth; 11.09.2019
comment
Общедоступная утилита: вы можете указать порт веб-сервера, поэтому используйте CSRF_TRUSTED_ORIGINS = ['localhost:8080'] - person Igor de Lorenzi; 21.07.2020
comment
Спасибо!!!!! Эти проблемы с CORS сводят меня с ума - person Jakob Lindskog; 24.06.2021

Для тех, кто следит за этим, если вы установили CORS_ORIGIN_ALLOW_ALL в True, вам больше не нужно устанавливать переменную CORS_ORIGIN_WHITELIST, поскольку вы уже разрешаете каждый хост.

РЕШЕНИЕ МОЕЙ ПРОБЛЕМЫ - может кому-то помочь

проблема, с которой мы столкнулись, была своеобразной: у нас есть клиентское приложение, отправляющее запросы с помощью TokenAuthentication другому приложению, CRM, созданная с использованием Django Admin и, следовательно, использующая SessionAuthentication. Когда мы открыли приложение администратора Django, SessionMiddleware автоматически создавал файл cookie session_id для этого домена. При открытии клиентского приложения и попытке выполнить запрос мы получили следующую ошибку:

Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.

Это произошло только потому, что файл cookie session_id уже был установлен в браузере, и поэтому запрос был выполнен с использованием SessionAuthentication вместо TokenAuthentication и завершился ошибкой.

Очевидно, что удаление файла cookie решило проблему.

person Tysoncete    schedule 15.05.2018