Интерфейс Laravel для бэкэнда Django x-csrf-token не разрешен в предполетном ответе - PullRequest
3 голосов
/ 18 июня 2019

У меня есть фреймворк 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/' от источника '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-token не разрешено 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.

1 Ответ

1 голос
/ 18 июня 2019

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

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

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

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

...