cors s3 кэш браузера расширение chrome

#google-chrome-extension #amazon-s3 #cors #browser-cache

#google-chrome-extension #amazon-s3 #cors #кэш браузера

Вопрос:

ДА. это сложный вопрос. я постараюсь изложить это вкратце.

Мой веб-сайт извлекает ресурсы из s3. У меня также есть расширение, которому требуется предварительная выборка этого файла s3, когда кто-то выполняет запрос Google, поэтому позже, когда они заходят на мой сайт, ресурс кэшируется. На данный момент мне, вероятно, следует подчеркнуть, что я не делаю ничего вредоносного. просто вопрос пользовательского опыта. Моя проблема в том. при выполнении ajax-запроса к s3 из расширения (либо из content-script, либо из background) заголовок origin не отправляется. Это означает, что ресурс загружается и кэшируется без заголовка allow origin. s3 не добавляет этот разрешающий источник: * если в запросе нет источника. итак, позже на моем сайте произошел сбой из-за отсутствия заголовка allow-origin в кэшированном файле:-(

Есть идеи о лучшем способе предварительной выборки из кэша браузера?

Есть ли способ принудительно отправить ajax-запрос на отправку источника? Любое происхождение? Поскольку у меня есть allow-origin: * в моей корзине s3, я думаю, что любой источник будет принимать значение null. Спасибо

Редактировать: в итоге использовалось одно из решений Rob W. Ты потрясающий. Позвольте мне прокомментировать каждый из предложенных им вариантов:

  1. Не добавлять предустановки хоста в мой манифест — умная идея, но у меня не сработает, поскольку у меня есть скрипт содержимого, который запускается на любом веб-сайте, поэтому я должен использовать универсальный шаблон, и я не думаю, что есть опция разрешения «исключить».

  2. Я попробовал это, он выдает нулевой источник, который, как и ожидалось, заканчивается в S3 отправкой заголовка allow-origin: *, как и требовалось. это означает, что я не получаю ошибку «отсутствует заголовок allow-origin», однако файл затем не передается из кэша. Я предполагаю, что для того, чтобы он действительно обслуживался из кэша в Chrome, это должно быть точно такого же происхождения. итак, это было очень близко, но недостаточно.

  3. третий вариант — это прелесть. И это самое простое. Я не знал, что могу манипулировать заголовком origin. Итак, я делаю это и устанавливаю точное происхождение моего веб-сайта — и это работает. Файл кэшируется, а затем отправляется из кэша. Я должен подчеркнуть, что мне пришлось добавить фильтр URL, чтобы применять его только к запросам, отправляемым в мою корзину s3, в противном случае я ожидаю, что это приведет к хаосу в браузере пользователя.

Спасибо. Отличная работа

Ответ №1:

У вас есть три варианта:

  1. Не добавляйте разрешение хоста для S3 в свой файл манифеста. Тогда у расширения не будет общего разрешения на доступ к ресурсу, и вместе с запросом будет отправлен Origin заголовок запроса.
  2. Используйте фрейм без расширения для выполнения AJAX-запроса. Например, следующий метод приведет к получению запроса GET из разных источников с помощью Origin: null .

     function prefetchWithOrigin(url) {
        var html = '<script>('   function(url) {
            var x = new XMLHttpRequest();
            x.open('GET', url);
            x.onloadend = function() {
                parent.postMessage('done', '*');
            };
            x.send();
        }   ')('   JSON.stringify(url)   ');</script>';
        var f = document.createElement('iframe');
        f.src = 'data:text/html,'   encodeURIComponent(html);
        (document.body || document.documentElement).appendChild(f);
        window.addEventListener('message', function listener(event) {
            // Remove frame upon completion
            if (event.source === f.contentWindow) {
                window.removeEventListener('message', listener);
                f.remove();
            }
        });
    }
      
  3. Используйте chrome.webRequest.onBeforeSendHeaders событие, чтобы вручную добавить заголовок Origin.

Комментарии:

1. @Ilanlewin XHR из разных источников не разрешен, если разрешение хоста не указано в permissions разделе файла манифеста, даже если существует сценарий содержимого с шаблоном «соответствует». Попробуйте, вы увидите Origin: chrome-extension://[ORIGIN] заголовок запроса при https://google.com/ доступе без разрешения origin. Эта функция разработана специально, поэтому на нее можно положиться.

2. Роб, я не знаю, что именно ты имел в виду под последним комментарием, но у меня в файле манифеста есть общие разрешения как для общих разрешений, так и для сценариев содержимого… вот так «разрешения»: [«http:// */*», «https://*/*», «content_scripts»: [ { «совпадения»: [«http://*/*»,»https://*/*»],

3. @Ilanlewin Если URL веб-сайта, к которому вы пытаетесь получить доступ с помощью AJAX (XMLHttpRequest), не соответствует ни одному из шаблонов соответствия в вашем permissions массиве, Chrome добавит Origin заголовок. То, указан ли хост также в matches in content_scripts , не имеет значения. Удалите http://*/* и https://*/* из permissions , и Chrome включит Origin заголовок запроса.