CORS в расширении хром - PullRequest
2 голосов

Я делаю расширение Chrome, и мне нужно сделать междоменный запрос POST к другому домену. Код работает в среде Chrome Content Script, которая имеет некоторые ограничения.

Я ввожу свой код на конкретный сайт с доменом, похожим на service.site.com, и я должен сделать запрос к домену, например api.site.com

Заголовки ответа от api.site.com выглядят как

access-control-allow-credentials: true
access-control-allow-headers: Authorization, Content-Type, X-Requested-With, Accept
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-origin: https://service.site.com

Как видите, другой домен разрешает запросы от service.site.com. Это означает, что заголовок Origin заголовков моего запроса должен содержать этот Origin.

Но расширение Chrome добавляет для меня заголовок Origin!

Теперь он отправляет запрос на api.site.com с заголовком

Origin: chrome-extension://oeminagccdkclchnelmkbkcpcfnjgofj

и api.site.com может заблокировать это? Я не получаю ничего в ответ. Сбой запроса, и я не вижу ошибок и данных в ответ.

Конечно, я добавил разрешения в файл манифеста:

"permissions": [
  "*://service.site.com/*",
  "*://api.site.com/*"
],

И это все еще не работает. Расширение Chrome продолжает изменять заголовок источника и сервер не отвечает. ИЛИ это отвечает, но мой браузер блокирует это? Я не могу узнать. Если я выполняю этот запрос в среде WEB-скрипта, он работает хорошо, и я вижу ответ от сервера. Но мне все еще нужно запустить его в среде Content-script.

Я даже пытался внедрить функцию с пост-запросом в среде веб-скриптов и вызывать ее из среды контент-скриптов, но если я делаю это таким образом, он добавляет заголовок Origin и не работает.

Я также пытался изменить заголовки Response, используя функции расширения Chrome, надеясь, что это поможет

const responseListener = function(details){
  const out = [];
  details.responseHeaders.forEach(item => {
    if (item.name.toLowerCase() !== 'access-control-allow-origin') {
      out.push(item);
    }
  });
  out.push({name: 'access-control-allow-origin', value: '*'});
  return {responseHeaders: out};
};

chrome.webRequest.onHeadersReceived.addListener(responseListener, {urls: ["*://*/*"]},
  ["blocking", "responseHeaders"]);

Теперь он показывает, что api.site.com возвращает мой заголовок, но это все равно не помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...