Я делаю расширение 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
возвращает мой заголовок, но это все равно не помогает.