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

Я использую:

  • Vue 2.0.3
  • vue-router 2.0.1
  • vuex 0.8.2
  • vue-resource 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, но это не помогло.

Любая идея? Что я делаю не так .. Полагаю, это не сработает и для других звонков, если не сработает для входа в систему.


person desicne    schedule 29.11.2016    source источник
comment
Это не похоже на проблему CORS (на что указывает ошибка 415), и в вашем коде клиентской части нет ничего плохого. Не могли бы вы предоставить фрагмент ключевого кода вашей серверной части?   -  person Aaron Chen    schedule 30.11.2016
comment
Вы были совершенно правы! У меня была проблема с проектом API, который не разрешал доступ из JS внутри браузеров.   -  person desicne    schedule 30.11.2016
comment
@desicne, можешь сказать, в чем была твоя проблема?   -  person Darem    schedule 22.08.2018
comment
@Darem не был проблемой внешнего интерфейса. Настройка сервера в то время не производилась.   -  person desicne    schedule 23.08.2018


Ответы (6)


Вы сталкиваетесь с этой ошибкой, если 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?

person Negar    schedule 07.04.2019
comment
Спасибо! Классный хак! В моем случае мне нужно добавить порт при запуске в разработке. module.exports = { devServer: { port: 3000, proxy: "http://localhost/api" } } - person Osh Mansor; 04.10.2019
comment
я получаю следующую ошибку Ошибка прокси: не удалось запросить прокси / с localhost: 8080 на localhost: 3000 / api / авторизация. - person vithu shaji; 19.05.2021

Хотя вы можете добавить 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 и использовать как можно более конкретный домен в своем белом списке.

Удачи!

person darryn.ten    schedule 29.11.2016

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

2) Vue.http.headers.common['Access-Control-Allow-Origin'] = true, Vue.http.headers.common['Access-Control-Allow-Origin'] = '*' и т. Д. Не нужны в запросе client.

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

person Nickensoul    schedule 13.07.2017

Более вероятно, что 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, поэтому его не следует применять в производственной среде, а только в среде разработки.

person Parthipan Natkunam    schedule 29.11.2016

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

изображение файла vue.config.js

person O.G    schedule 19.08.2020

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

res.header ('Доступ-Контроль-Разрешить-Происхождение', '*');

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');

person Rai Ahmad Fraz    schedule 18.02.2021
comment
Это ужасно небезопасно, если оно попадет в производство. - person darryn.ten; 12.03.2021
comment
@ darryn.ten, не могли бы вы направить меня правильным путем? - person Rai Ahmad Fraz; 15.03.2021
comment
Небезопасное решение не должно быть ответом на проблемы с подключением или CORS. - person Gi1ber7; 20.06.2021