2016-02-15 1 views
0

У меня есть приложение Django, которое работает под доменом в основном, но и под другими доменами (в основном для тестирования). У меня также есть отдельный субдомен, который обслуживает клиентский код веб-приложения для пользователей.CSRF не работает с несколькими доменами (не поддоменами), обслуживаемыми приложением Django

Основным доменом для API является api.domain.com, а приложения развернуты до apps.domain.com. Промежуточные серверы не находятся под одним и тем же доменным именем; они живут на stagingX.otherdomain.com. Это вне моего контроля.

Проблема, которую я имею, что я получаю отказы CSRF, когда я пытаюсь войти в систему из apps.domain.com:

Failed to load resource: the server responded with a status of 403 (OK) 
login error: "CSRF Failed: Referer checking failed - http://apps.domain.com/ does not match https://api.domain.com/." 

Это простой мир, который я бы просто установить CSRF_COOKIE_DOMAIN в *.domain.com и сделать. Однако это полностью разрушает мою способность выполнять код перед развертыванием, потому что прямой доступ к API на stagingX.otherdomain.com также должен работать для различных тестов, которые необходимо запустить.

Может ли кто-нибудь просветить меня о том, как именно я должен это настроить? Я ругаю день, когда решил развернуть приложения на отдельный сервер, но развертывание приложений и развертывание API следует разделить по другим причинам ... это просто заводит меня в орехи.

Заранее спасибо.

- EDITED добавить дополнительную информацию -

Для чего это стоит, я использую защиту CORS, а также. Похоже, что в этом случае я должен использовать какой-то заголовок CORS, а не CSRF, но я не полностью понимаю механизм CORS, чтобы понять, есть ли это решение. У меня есть apps.domain.com whitelisted, но это не работает при входе в систему и, возможно, на других конечных точках (не может пройти мимо входа, чтобы проверить остальные).

+0

В краткосрочной перспективе я установил аутентификацию на основе токенов и CSRF-освободил конечную точку входа, похоже, работает, но это не идеально. – seawolf

ответ

2

В 1.9 была добавлена ​​настройка CSRF_TRUSTED_ORIGINS. Вы можете установить это в список (суб) домены, которые действительны в чеке CSRF ссылающейся:

CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com'] 

установить это в файле настроек для api.domain.com, и он будет принимать запросы POST от всех 3-х доменов.

+0

К сожалению, я не могу запустить 1.9. Это работает в Google App Engine с DjangoAppEngine, чтобы использовать хранилище данных вместо SQL в качестве базы данных, а DAE еще не до 1,9. – seawolf

Смежные вопросы