Пытаюсь получить JSON с внешнего домена. Всё бы ничего, но он защищен с помощью Basic Authentication, что почему-то осложняет доступ многим браузерам.
Свободно вертеть внешним доменом нет возможности, настроить то можно, но он администрируется на стороне клиента и дергать его постоянно нет возможности. Поэтому пришлось создать тестовый стенд в вакууме.
Есть следующий код на внешнем домене:
<?php
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: http://clientdomain");
?>
{ "result": "ok" }
Следующий код на клиенте:
$('button').click(function(){
$.ajax({
url: 'http://overestimated.info/script.php',
type: 'GET',
crossDomain: true,
dataType: 'json',
username: 'user',
password: 'user',
success: function(x, status){
console.log(JSON.stringify(x));
},
error: function(x, status, error){
console.log(status);
console.log(error);
}
});
});
В Chrome и Safari код работает как положено и получает нужный JSON. В остальных же браузерах начинается печаль: если верить Fiddler, то запрос на внешний домен не уходит вовсе, а в консоли приходит ошибка.
Opera: status: «error», error: ""
IE10: status: «error», error: «InvalidAccessError»
FF: status: «error», error: "[Exception… «Access to restricted URI denied» code: «1012» nsresult: «0x805303f4 (NS_ERROR_DOM_BAD_URI)» location: «
clientdomain/js/lib/jquery-1.10.0.min.js Line: 6»] { constructor=DOMException, code=1012, INDEX_SIZE_ERR=1, more...}" (там целый объект)
Много гуглил, много пробовал, но пробиться не могу. Есть советы включать withCredentials в запросе
xhrFields: {
withCredentials: true
}
или
beforeSend: function(xhr){
xhr.withCredentials = true;
},
Это не помогает, запрос все так же обламывается еще в браузере перед отправкой.
Вот
пример. jsfiddle почему-то не нравится IE и Opera, но в Chrome, Safari и Firefox все отрабатывается так как я описал.
Помогите пожалуйста понять, в чем дело.
PS: на тестовом стенде Basic Auth не настроен, но он по сути и не нужен: либо работает как надо, либо отшибается еще до отправки запроса.