jQuery Ajax - POST от Localhost не генерирует заголовок «Access-Control-Allow-Origin»

Я думал, что понял CORS, но, видимо, я чего-то не понимаю. У меня есть приложение, которое я пытаюсь запустить с локального хоста. Этому приложению необходимо отправить запрос в службу поиска Azure. Я пытаюсь загрузить поисковый документ. В попытке сделать это у меня есть следующее:

var url = 'https://my-app.search.windows.net/indexes/test/docs/index?api-version=2015-02-28';
$.ajax({ 
  url: url,
  type: 'POST',
  contentType:'application/json',
  headers: {
    'api-key':'XXXXXX',
    'Content-Type':'application/json'
  },
  beforeSend: function (req) {
    req.setRequestHeader('Access-Control-Allow-Origin', '*');
  },                    
  data: JSON.stringify({
    '@search.action':'upload',
    'id': '1',
    'name': 'some name'
  }),
  success: function() { alert('success'); },
  error: function() { alert('check the console window.'); }
});                   

Конечно, url и api-key не настоящие. Тем не менее, я могу успешно отправить эти данные, если использую POSTman. Тем не менее, когда я пытаюсь отправить его из своего приложения через jQuery, я получаю сообщение об ошибке в окне консоли, в котором говорится:

Failed to load resource: the server responded with a status of 403 (Forbidden)

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:72' is therefore not allowed access. The response had HTTP status code 403.

У меня есть параметры CORS «Разрешенный тип источника» для моей службы поиска Azure, установленные на «Все». Так что в основном, его широко открытым. Тем не менее, я все еще получаю эту ошибку CORS.

Как отправить данные в эту службу из jQuery на локальном хосте?


person user687554    schedule 09.05.2016    source источник
comment
Мне кажется, что ответ 403 (Forbidden) является настоящим ключом здесь. Вы можете быть перенаправлены на страницу с ошибкой, которая не поддерживает CORS. Вы уверены, что ваш api-key правильный? Проверьте в консоли Network своего браузера отправленные заголовки запроса.   -  person Phil    schedule 10.05.2016
comment
Не имеет смысла устанавливать заголовок Access-Control-Allow-Origin на клиенте. Все заголовки Access-Control-Allow-XXX являются исключительной ответственностью сервера.   -  person Michal Foksa    schedule 10.05.2016
comment
@Phil - я уверен, что api-key правильно. Фактически, я использую его для доступа к другим конечным точкам той же службы. Ключ, который я использую, является первичным ключом администратора, поэтому у него должны быть все привилегии.   -  person user687554    schedule 10.05.2016


Ответы (1)


Поиск Azure позволяет выполнять операции запросов только через CORS, но не операции управления или индексирования (см. MSDN для получения подробной информации о поддержке поиска Azure для CORS).

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

person Bruce Johnston    schedule 10.05.2016