Как использовать сервисного работника с базовой аутентификацией (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()
их в соответствующий массив Request
s:
var urls = ['page1.html', 'page2.html'];
caches.open('my-cache').then(cache => {
return cache.addAll(urls.map(url => new Request(url, {credentials: 'same-origin'})));
});