Интерфейс Laravel для бэкэнда Django x-csrf-token не разрешен в предполетном ответе

У меня есть фреймворк Laravel с VueJS в качестве интерфейса. Этот интерфейс размещен на локальном сервере xampp на портах 80 443 с настроенным URL-адресом "http://test.net". Я отправляю запросы API из приложения VueJS, используя axios, на бэкэнд Django, где я установил рабочую структуру Rest (доступную через Postman). Внутренний сервер - http://127.0.0.1:8000. Поскольку серверы разные, я установил пакет django-cors-headers и настроил файл settings.py, чтобы включить этот пакет, а также включить промежуточное ПО, как показано в документации.

Это запрос axios от Vue:

let url = "http://localhost:8000/leadmanager/api/lead/";
axios.get(url)
    .then(res => console.log(res.data))
    .catch(error => console.log(error));

Изначально у меня возникла такая ошибка:

Доступ к XMLHttpRequest по адресу 'http://localhost:8000/leadmanager/api/lead/ 'from origin' http://test.net 'заблокирован политикой CORS: ответ на запрос предварительной проверки не пройти проверку контроля доступа: на запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin.

Итак, я проверил документацию и установил django-cors-headers и включил URL-адрес веб-сайта Laravel в CORS_ORIGIN_WHITELIST.

CORS_ORIGIN_WHITELIST = [
    "http://test.net"
]

После этого я получаю другую ошибку. Я подозревал, что это происходит из-за того, что Laravel по умолчанию прикрепляет заголовки x-csrf-token к отправляемым пакетам.

Доступ к XMLHttpRequest по адресу 'http://localhost:8000/leadmanager/api/lead/ 'from origin' http://test.net 'заблокирован политикой CORS: поле заголовка запроса x-csrf- токен не разрешен Access-Control-Allow-Headers в предпечатном ответе.

Чтобы разрешить запросы с x-csrf-tokens, я попробовал следующие настройки для django-cors-headers в settings.py:

CORS_ALLOW_HEADERS = [
    'x-csrftoken'
]



CSRF_TRUSTED_ORIGINS = [
    'http://test.net'
]

Итак, как мне настроить бэкэнд Django, чтобы разрешить запросы от Laravel, прикрепленные с x-csrf-headers? Я хочу сделать это без необходимости изменять настройки Laravel, чтобы не прикреплять эти заголовки, поскольку они являются функцией безопасности, реализованной Laravel для смягчения атак CSRF.


person Tribunal    schedule 18.06.2019    source источник
comment
Вы добавили django.middleware.csrf.CsrfViewMiddleware в промежуточное ПО?   -  person bak2trak    schedule 18.06.2019
comment
Да, я поставил это как промежуточное ПО согласно документации для django-cors-headers. Порядок промежуточного программного обеспечения Cors, Common, Csrf   -  person Tribunal    schedule 18.06.2019
comment
Взгляните на этот комментарий stackoverflow.com/a/38842030/6682340   -  person Krukas    schedule 18.06.2019
comment
@Krukas Я включил только имя хоста test.net внутри CSRF_TRUSTED_ORIGIN в качестве указанного комментария, но ничего не изменилось.   -  person Tribunal    schedule 18.06.2019
comment
Это может помочь stackoverflow.com/questions/32500073/   -  person bak2trak    schedule 18.06.2019
comment
@ bak2trak Помог тот ответ в ссылке. Скоро отправлю ответ.   -  person Tribunal    schedule 18.06.2019


Ответы (1)


После обращения к https://stackoverflow.com/a/32501365/10888237, указанному @ bak2trak, я проверил запрос Заголовки, отправляемые приложением Laravel из консоли разработчика Chrome (вкладка «Сеть»), заголовками запроса были «x-csrf-token и x-request-with». Поэтому я изменил CORS_ALLOW_HEADERS, добавив заголовок «x-requested-with».

CORS_ALLOW_HEADERS = [
    'x-csrf-token',
    'x-requested-with'
]

Это дало другую ошибку, 401 [Unauthorized], поэтому я удалил классы аутентификации по умолчанию для REST_FRAMEWORK.

Теперь запросы могут, наконец, проходить, и я получаю соответствующий ответ от бэкэнда Django на свои запросы GET в Laravel.

person Tribunal    schedule 18.06.2019