CORS проблема с Vue.js

Я использую:

  • Vue 2.0.3
  • vue-router 2.0.1
  • vuex 0.8.2
  • vue-ресурс 0.7.0

И после попытки войти на мою страницу при использовании удаленного API, а не локально запущенного, я получаю ошибку cors, как показано ниже

vue-resource.common.js?2f13:1074 OPTIONS 

https://mywebsite/api/auth/login 

(anonymous function) @     vue-resource.common.js?2f13:1074
Promise$1            @     vue-resource.common.js?2f13:681
xhrClient            @     vue-resource.common.js?2f13:1033
Client               @     vue-resource.common.js?2f13:1080
(anonymous function) @     vue-resource.common.js?2f13:1008


XMLHttpRequest cannot load https://mywebsite/api/auth/login. 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested 
resource. Origin 'http://localhost:8080' is therefore not allowed 
access. The response had HTTP status code 415.

Теперь у меня есть API, работающий в Azure, и, поскольку он позволяет мне тестировать свои звонки из Postman, я совершенно уверен, что заголовки CORS установлены правильно на бэкэнде. Не так уверен насчет Vue и фронта.

У меня такая ситуация в конфигурационных файлах:

export const API_ROOT = 'https://mywebsite/api/'
export const AuthResource = Vue.resource(API_ROOT + 'auth{/action}')

чем то, что я называю это действие как:

login: function (userData) {
    return AuthResource.save({action: 'login'}, userData)
}

Наконец, когда я проверяю авторизацию при входе через токен в подмодуле vuex, у меня просто состояние проверки заголовка.

var updateAuthHeaders = () => {
    var token = JSON.parse(localStorage.getItem("auth_token"))
    if (token != null){
        Vue.http.headers.common['Authorization'] = token
    }else{
        Vue.http.headers.common['Authorization'] = null
    }
}

Я пробовал добавлять Vue.http.headers.common['Access-Control-Allow-Origin'] = true здесь, но не помогло дело.

Любая идея? Что я делаю не так... Я полагаю, что он не будет работать для других звонков, даже если он не работает для входа в систему.

7 ответов

Вы сталкиваетесь с этой ошибкой, когда URL-адрес API и URL-адрес клиента не совпадают. Vue CLI 3 (и, в сущности, Webpack) позволяет вам перенаправлять URL-адрес вашего API на URL-адрес вашего клиента.

внутри vue.config.js В файл добавьте следующие строки:

// vue.config.js
module.exports = {
  // options...
  devServer: {
        proxy: 'https://mywebsite/',
    }
}

А затем отправьте ваши AJAX-звонки http://localhost/api/,

Вы можете прочитать полную статью здесь: Как бороться с ошибкой CORS в Vue CLI 3?

1) Убедитесь, что сервер отправляет Access-Control-Allow-Origin "*" заголовок.

2) Vue.http.headers.common['Access-Control-Allow-Origin'] = true, Vue.http.headers.common['Access-Control-Allow-Origin'] = '*' и т. д. не требуется в запросе клиента.

3) Vue.http.options.emulateJSON = true следует помогает, если 1 и 2 точки уже в порядке, но vue-resource не удается с status 0, Также попробуйте удалить (если они существуют) Vue.http.options.credentials = true а такжеVue.http.options.emulateHTTP = true,

Пока вы можете добавить Access-Control-Allow-Origin: * на ваш сервер ответ (в данном случае IIS), но это очень не рекомендуется.

Здесь происходит то, что ваш клиент http://localhost и он пытается получить доступ https://mywebsite/api/ что означает, что они не из того же происхождения

Если вы добавите Access-Control-Allow-Origin: * вы позволите всему миру достичь вашей конечной точки API.

Я бы предложил сделать заголовки вашего сервера контроля доступа Access-Control-Allow-Origin: *.mysite и сделать призрак для вашего localhost использовать dev.mysite или похожие.

Это позволит вашему "localhost" получить доступ к вашему API без проблем.

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

Итак, вкратце, создайте виртуальный хост для вашего локального хоста, который находится в том же домене, что и служба REST, и ваша проблема должна быть решена.

Как только вы выйдете вживую, вы должны удалить *.mysite разделяйте и используйте как можно более конкретный домен в своем белом списке.

Удачи!

Большая вероятность, что CORS не включен в IIS. Это можно включить, изменив файл web.config в корневой папке приложения в IIS следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
   <httpProtocol>
         <customHeaders>
           <add name="Access-Control-Allow-Origin" value="*" />
         </customHeaders>
   </httpProtocol>

</system.webServer>
</configuration>

Примечание. Этот метод позволит любому достичь конечной точки API и, следовательно, не должен применяться в производственной среде, а только в среде разработки.

Вам нужен файл vue.config.js в корне вашего проекта и внутри файла vue.config, который вам нужен для определения вашего прокси в объекте devServer. module.exports = { devServer: { proxy: 'https://exampledomain.com/api/'}};. Теперь в вашем axios.post вы можете сделать запрос, просто выполнивhttps://exampledomain.com/api/login

Или вы можете обойти это для целей разработки с помощью расширения chrome CORS. Работает с кодами и коробкой

Просто прикрепите их в ответ на все свои API

res.header('Access-Control-Allow-Origin','*');

res.header('Access-Control-Allow-Methods','GET, POST, OPTIONS, PUT, PATCH, DELETE');

res.header('Access-Control-Allow-Headers', 'Источник, Content-Type,X-Requested-With, Accept, Authorization');

Другие вопросы по тегам