Access-Control-Allow-Origin: "*" не разрешено, если флаг учетных данных имеет значение true, но нет заголовка Access-Control-Allow-Credentials

Внезапно, казалось бы, ничего не изменив в моем веб-приложении, я начал получать ошибки CORS при открытии его в Chrome. Я попытался добавить заголовок Access-Control-Allow-Origin: *. Затем я получаю эту ошибку:

XMLHttpRequest cannot load http://localhost:9091/sockjs-node/info?t= 1449187563637. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3010' is therefore not allowed access.

Но, как вы можете видеть на следующем изображении, заголовок Access-Control-Allow-Credentials отсутствует.

введите описание изображения здесь

WTF? Ошибка Chrome?

Моя страница загружается в http://localhost:3010, и этот сервер также без проблем использует Access-Control-Allow-Origin: *. Есть ли проблема, если оба конечных точки используют его?

Ответы

Ответ 1

"флаг учетных данных" относится к XMLHttpRequest.withCredentials запрашиваемого запроса, а не к заголовку Access-Control-Allow-Credentials.. Это было источником моей путаницы.

Если запрос withCredentials равен true, Access-Control-Allow-Origin: * не может использоваться, даже если заголовок Access-Control-Allow-Credentials отсутствует.

Ответ 2

Я решил такую ​​же проблему, выполнив следующие шаги.

1) отключите расширение chrome "Allow-Control-Allow-Origin"

2) добавьте их в свою службу

var xhr = new(); xhr.withCredentials = true;

Ответ 3

Запросы withCredentials:true на сервере, настроенном на Access-Control-Allow-Origin: * МОЖЕТ использоваться, но вам понадобится еще дополнительная настройка на вашем сервере:

Используя Access-Control-Allow-Origin=* на сервере, он не разрешит доступ к какому-либо ресурсу (который требует учетных данных) для любого запроса xhr CORS.

Обходные:

  • Сделать этот удаленный ресурс на сервере доступным без учетных данных (и используйте xhr.withCredentials = false)
  • Создайте правило перезаписи на   сервер, чтобы изменить заголовок ответа    Access-Control-Allow-Origin=* в начало запроса. Ты можешь   также примените эту переписку по определенным критериям, например, если   запрос использует определенный порт или он исходит из списка белых списков   домены.

Ниже приведена статья в которой объясняется, как это сделать на сервере IIS, но вы можете сделать это на многих других серверах:

PS: в случае использования учетных данных вам также понадобится следующий заголовок ответа сервера: Access-Control-Allow-Credentials=true

PS2: только 1 значение разрешено для параменования "access-control-allow-origin". Если вы попытаетесь использовать, например, два домена: domain1.com domain2.com, это не сработает.