Подтвердить что ты не робот

Запрос CORS завершается с ошибкой в ​​Chrome, только если у него есть заголовки

Я пытаюсь отправить простой запрос CORS на внешний сервер приложений, который использует ключ сеанса для авторизации.

$.ajax({
    type: "GET",
    url: "https://192.168.1.72:8442/api/file/",
    headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"}
});

Он отлично работает в Firefox 18, Opera 12.12 и Rekonq 2.0 (использует также WebKit), но не работает в Google Chrome (проверенные версии 21 и 24). В Google Chrome показано, что ресурс OPTIONS Resource не загружается в Network Inspector, и сервер приложений не получает никакого запроса. Я пробовал jQuery 1.8.3 и 1.9.0.

Request URL:https://192.168.1.72:8442/api/file/
Request Headers
Access-Control-Request-Headers:accept, authorization, origin
Access-Control-Request-Method:GET
Cache-Control:no-cache
Origin:https://192.168.1.72:8480
Pragma:no-cache

Если я удаляю заголовки из запроса, я получаю 401 также в Google Chrome и могу получить доступ к ресурсу, если авторизация отключена на сервере приложений. Не имеет значения, какие заголовки отправлены. Только заголовок, который я могу отправить, это { "Content-Type": "plain/text" }. Все другие имена/значения заголовков приводят к ошибке в Google Chrome, но работают во всех браузерах, о которых я упоминал выше.

Почему Google Chrome не обрабатывает заголовки в запросе CORS?

4b9b3361

Ответ 2

Я использую самозаверяющий сертификат на моем сервере api, и это, похоже, проблема. Я обнаружил, что если я запустил Google Chrome с опцией --disable-web-security, тогда работает CORS с заголовками запросов. Без --disable-web-security я могу отправлять запросы CORS на самозаверяющий сервер api, но не могу добавлять заголовки (кроме Content-Type).

Ответ 3

Я обнаружил, что Access-Control-Allow-Headers: * должен быть установлен ТОЛЬКО для запроса "ОПЦИИ". Если вы вернете его для запроса POST, браузер отменит запрос (по крайней мере, для хрома)

Следующий код PHP работает для меня

// Allow CORS
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');    
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  header("Access-Control-Allow-Headers: *");
}

Я нашел похожие вопросы с некоторыми вводящими в заблуждение ответами: - Серверный поток говорит, что это ошибка с хромом на 2 года: Access-Control-Allow-Headers не соответствует локальному хосту. Это неправильно: я могу использовать CORS для моего локального сервера с Post Post - Access-Control-Allow-Headers принимает подстановочные знаки. Это также неправильно, подстановочный шаблон для меня (я тестировал только с Chrome)

Мне понадобится полдня, чтобы выяснить проблему.

Счастливое кодирование

Ответ 4

Серверная сторона: Сервер должен установить заголовок "Access-Control-Allow-Credentials", а также установить разрешенные заголовки в "Access-Control-Allow-Headers".

Клиентская сторона. Вы можете установить xhrFields в $.ajax() вместо явно передающего заголовок Auth.

xhrFields: {
    withCredentials: true 
}

Подробнее здесь.