Как использовать сервисного работника с базовой аутентификацией (NTLM, согласование)

Я пытался использовать работника службы на размещенном на веб-сайте IIS веб-сайте, который кэширует часть статического содержимого сайта. Сайт является внутренним приложением, использующим проверку подлинности Windows. Я смог зарегистрироваться и запустить работника сервиса без особых хлопот, но как только я открываю кеш и начинаю добавлять файлы в кеш, обещание не выполняется с ошибкой авторизации. возвращенный результат HTTP - 401 Unauthorized. Это обычный ответ для первых нескольких запросов, пока браузер и сервер не смогут согласовать авторизацию.

Я скоро опубликую некоторый код, который должен помочь с объяснением.

РЕДАКТИРОВАТЬ

var staticCacheName = 'app-static-v1';
console.log("I AM ALIVE");
this.addEventListener('install', function (event) {
    console.log("AND I INSTALLED!!!!");
    var urlsToCache = [
        //...many js files to cache
        '/scripts/numeral.min.js?version=2.2.0',
        '/scripts/require.js',
        '/scripts/text.js?version=2.2.0',
        '/scripts/toastr.min.js?version=2.2.0',
    ];


    event.waitUntil(
        caches.open(staticCacheName).then(function (cache) {
            cache.addAll(urlsToCache);
        }).catch(function (error) {
            console.log(error);
        })
    );
});

1 ответ

Решение

Это всего лишь предположение, учитывая отсутствие кода, но если вы делаете что-то вроде:

caches.open('my-cache').then(cache => {
  return cache.add('page1.html'); // Or caches.addAll(['page1.html, page2.html']);
});

вы пользуетесь неявным Request создание объекта (см. раздел 6.4.4.4.1), которое происходит при передаче строки cache.add()/cache.addAll(), Request Созданный объект использует режим учетных данных по умолчанию, который 'omit',

Вместо этого вы можете явно создать Request объект, содержащий режим учетных данных, который вы предпочитаете, который в вашем случае, вероятно, будет 'same-origin':

caches.open('my-cache').then(cache => {
  return cache.add(new Request('page1.html', {credentials: 'same-origin'}));
});

Если у вас было несколько URL-адресов, которым вы передавали массив cache.addAll(), вы можете .map() их в соответствующий массив Requests:

var urls = ['page1.html', 'page2.html'];
caches.open('my-cache').then(cache => {
  return cache.addAll(urls.map(url => new Request(url, {credentials: 'same-origin'})));
});
Другие вопросы по тегам