2016-03-08 17 views
6

Я много об этом слышал, но ничто не может исправить мою проблему.Django 1.9 AJAX форма CSRF токен 403 ошибка - «CSRF cookie not set»

Проблема:

С CSRF промежуточного слоя включен, Джанго отвечает 403 по запросу AJAX форме, с указанием:

"CSRF печенье не установлено."

После documentation, функциональность JS была реализована, что устанавливает пользовательские заголовок "X-CSRFToken".

Он работает, как ожидалось, получает "csrftoken" куков из браузера и постов вместе с запросом AJAX:

x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2 

Но ответ еще 403.

Пробовал решение:

Я пробовал все, что мог найти на SO или в Интернете, в частности:

  • Проверка, что промежуточное программное обеспечение включено:

    MIDDLEWARE_CLASSES = [ 
        ... 
        'django.middleware.common.CommonMiddleware', 
        'django.middleware.csrf.CsrfViewMiddleware', 
        'django.contrib.auth.middleware.AuthenticationMiddleware', 
        ... 
    ] 
    
  • Различные браузеры с печеньем поддержкой;

  • Отделка моего вида @ensure_csrf_cookie;

  • {% csrf_token %} в моем шаблоне;

  • Использование render ярлык, который принимает правильный контекст запроса;

  • Урегулирование пользовательских CSRF_COOKIE_NAME и CSRF_HEADER_NAME в моих settings.py;

  • Явная установка CSRF_COOKIE_SECURE = False и CSRF_COOKIE_HTTPONLY = False;

  • Явная установка CSRF_TRUSTED_ORIGINS настройка;

  • Тестирование на сервере разработки и производства;

  • Даже request.META["CSRF_COOKIE_USED"] = True, на мой взгляд, как кто-то предложил.

И еще ничего не получил.

Заголовки:

Если я использую @csrf_exempt и print(request.META) на мой взгляд, это ясно, что пользовательский заголовок «X-CSRFToken» присутствует в запросе и отформатирован в соответствии с Джанго документации, с префиксом «HTTP_» , заменить дефисы символом подчеркивания, все прописные буквы: "HTTP_X_CSRFTOKEN".

Более того, это значение соответствует cookie, установленному Django.

Печенье:

Странная вещь, если я пытаюсь print(request.COOKIES) на мой взгляд, на странице и форма нагрузки я могу видеть «csrftoken» печенье, но словарь пустой по запросу AJAX , Это может быть проблема?

Отчаявшись найти то, что на самом деле неправильно. Спасибо за чтение этого.

+0

Можете ли вы показать действительное мнение и JavaScript? – Alasdair

+0

Что вы используете для отправки запроса AJAX? JQuery? – Smile0ff

+0

@ Smile0ff: API-интерфейс Fetch. – Nevertheless

ответ

6

Ок, вопрос довольно прост, то:

Fetch API не отправляет учетные данные по умолчанию. По MDN:

Полномочия свойство только для чтения интерфейса запроса указывает , должен ли агент пользователя отправить печенье из другого домена в случае запросов кросс происхождения. Это похоже на флаг XHR с флагомCredentials, но с тремя доступными значениями.

По умолчанию omit, и он никогда не отправляет файлы cookie. Вам просто нужно добавить same-origin ваших аргументов функции fetch():

fetch(formUrl, { 
    ... 
    credentials: 'same-origin', 
    ... 
}) 

И вы будете хорошо идти:)

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