Cross-Origin XMLHttpRequest не работает в упакованном приложении Chrome, несмотря на наличие URL-адреса в разрешениях

У меня проблема, аналогичная этому другому вопросу о SO, "XMLHttpRequest не работает в упакованном веб-приложении Google Chrome". Однако выбранный ответ не работает для меня. У меня есть URL-адрес, который я пытаюсь запросить, указанный в разрешениях манифеста. У меня есть ощущение, что это связано с предотвращением межсайтового скриптинга, о чем я читал в XMLHttpRequest и документы Встроить контент для Chrome.

Когда я проверяю ответ, все пусто, нет кода status, нет response, нет statusText, точно так же, как это происходит при попытке сделать запрос между доменами, как в XSS, как показано в этом вопросе SO: Пустой текст ответа из XMLHttpRequest.

Вот мой манифест:

{
    "manifest_version" : 2,
    "name": "{name}",
    "description" : "{description}",
    "version" : "0.1",
    "minimum_chrome_version": "23",

    "permissions": [
        "idle",
        "storage",
        "notifications",
        "https://prefix.domain.suffix/*",
        "https://prefix.domain.suffix/sub/"
    ],

    "app": {
        "background": {
          "scripts": ["models.js", "background.js"]
        }
    },


    "icons": { "16": "icon-16.png", "128": "icon-128.png" }
}

Я использую эту функцию для выполнения запросов:

function xhr(url, callback){
    var timeout= 2000;
    var xhr = new window.XMLHttpRequest();
    xhr.ontimeout = function () {
        console.error("The request for " + url + " timed out.");
    };
    xhr.onerror = function(){
        console.error("error: "+xhr.statusText);
    }
    xhr.onload = function() {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                window.console.log("response: "+xhr.response);
                callback(JSON.parse(xhr.response));
            } else {
                console.error(xhr.statusText);
            }
        }
    };
    xhr.open("GET", url, true);
    xhr.timeout = timeout;
    xhr.send(null);
}

URL-адрес, который я пытаюсь запросить, довольно простой, с некоторыми параметрами строки запроса, добавленными в конце, и выглядит следующим образом:

https://prefix.domain.suffix/sub/serve.aspx?param1=val1&param2=val2

Который при загрузке в браузере возвращает простой и корректный JSON:

{
    "ret" : [

        { "date": 1380603600000, "foo": bar1 }, 
        { "date": 1380776400000, "foo": bar2 }
    ]
}

Функция, которую я использую для тестирования в консоли разработчика, такова:

xhr('https://prefix.domain.suffix/sub/serve.aspx?param1=val1&param2=val2', function(e){ console.log(e); });

В консоль выводится только error:, а xhr в этот момент:

XMLHttpRequest {statusText: "", status: 0, response: "", responseType: "", responseXML: null…}

Еще одна вещь, которую, возможно, необходимо учитывать, заключается в том, что этот URL-адрес, который я запрашиваю, находится за аутентификацией на моем сервере. Я вошел в систему и могу получить доступ к странице, независимо от того, какую вкладку я использую, поэтому я не думаю, что это проблема, но она все же может быть.


person Kyle Falconer    schedule 04.10.2013    source источник
comment
Приложения не используют хранилище файлов cookie вашего браузера. В этом отношении они похожи на нативные приложения. Таким образом, ваш последний абзац, вероятно, является проблемой. Перейдите на сервер, который не требует аутентификации в качестве теста для подтверждения. Затем исследуйте chrome.identity.   -  person sowbug    schedule 05.10.2013
comment
@sowbug, я попробую, но тебе не кажется, что если бы это была проблема аутентификации, в объекте xhr был бы какой-то код состояния?   -  person Kyle Falconer    schedule 05.10.2013
comment
Наверное, проще попробовать, чем тут строить догадки. Дайте нам знать.   -  person sowbug    schedule 05.10.2013
comment
@sowbug, вот оно! Теперь мне просто нужно выяснить, как я могу аутентифицироваться.   -  person Kyle Falconer    schedule 08.10.2013
comment
@sowbug, если вы ответите, я приму это как решение.   -  person Kyle Falconer    schedule 22.11.2013


Ответы (2)


Приложения не используют хранилище файлов cookie вашего браузера. В этом отношении они похожи на нативные приложения. Таким образом, ваш последний абзац, вероятно, является проблемой. Перейдите на сервер, который не требует аутентификации в качестве теста для подтверждения. Затем исследуйте chrome.identity.

person sowbug    schedule 22.11.2013
comment
но что бы вы порекомендовали, если упакованному приложению Chrome действительно действительно нужна базовая аутентификация через HTTPS вместо OAuth (например, сделать умный клон протокола Http репозитория git из Github или Bitbucket)? так как chrome.identity тут не поможет... - person Maks; 22.05.2014
comment
Это новый вопрос. Спроси это! - person sowbug; 22.05.2014
comment
да хорошая мысль! Я сделал это, и в процессе написания я понял это решение, поэтому спасибо за подсказку... stackoverflow.com/questions/23798304/ - person Maks; 22.05.2014

 if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp = new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }

попробуй это...

person user3917953    schedule 05.10.2013
comment
Это не решит проблему. Я делаю упакованное приложение для Chrome, а это значит, что у меня гарантированно есть функция XMLHttpRequest, и этот код никогда не будет запущен в IE. Спасибо, что ответили. - person Kyle Falconer; 05.10.2013