Не удается подключиться к локальному хосту с расширения Chrome

Я работаю над расширением Chrome, которое отслеживает время и использует Google App Engine для бэкэнд.

Для тестирования я пытаюсь подключить локальную версию расширения к локальной версии приложения App Engine. Когда я пытаюсь отправить запрос POST, я получаю:

XMLHttpRequest cannot load http://localhost:8080/report. Origin chrome-extension://mbndmimplohfkkcincjodnfpaapbbmei is not allowed by Access-Control-Allow-Origin.

Но он работает, когда я изменяю URL-адрес, чтобы он отправлял URL-адрес appspot.com.

Что такое Access-Control-Allow-Origin, и почему это мешает мне получать результаты от localhost?

Ответ 1

Я считаю, что это связано с тем, что вы не можете делать вызовы на сервер, который не включен в раздел разрешений вашего манифеста. Раздел разрешений manifest.json должен выглядеть примерно так:

"permissions": [
    "http://myapp.appspot.com/*",
    "http://localhost/*"
]

Заметьте, я не тестировал это, но похоже, что вот почему ваша проблема исходит.

Ответ 2

вы не можете добавлять порты в разрешениях. Вы должны использовать порт 80 для расширений в манифесте разрешений. Обычно я запускаю nginx и маршрутизирую весь трафик с моих расширений на порт 80.

Ответ 3

Вы можете использовать пользовательские порты.

manifest.json

"permissions": ["http://localhost/*"]

background.js (используя jQuery)

$.post('http://localhost:5000/some-endpoint');

Ответ 4

Мне удалось заставить этот код работать:

var loginPayload = {};
loginPayload.username = document.getElementById('username').value;
loginPayload.password = document.getElementById('password').value;
console.log(loginPayload);

var callback = function (response) {
    console.log(response);
};
var handle_error = function (obj, error_text_status){
    console.log(error_text_status + " " + obj);
};

$.ajax({
    url: 'https://127.0.0.1:8443/hello',
    type: 'POST',
    success: callback,
    data: JSON.stringify(loginPayload),
    contentType: 'application/json',
    error: handle_error
});

EDIT:
Видимо кому-то это не понравилось, поэтому нужно помнить несколько вещей:

  • Для расширений, которые должны работать на https, убедитесь, что ваш сервер обслуживает https.
  • В отличие от сообщений выше, хром-расширения могут обслуживать порты, отличные от порта 80/443