2016-07-04 6 views
2

Я пытался использовать сервисного работника на веб-сайте, который был включен IIS, который кэширует часть статического содержимого сайта. Сайт является внутренним приложением, использующим проверку подлинности Windows. Я смог зарегистрировать и запустить сервисного работника без лишних хлопот, но как только я открою кеши и начну добавлять файлы в кеш, обещание терпит неудачу с отказом авторизации. возвращаемый результат HTTP - 401 Несанкционированный. Это обычный ответ для первых нескольких запросов, пока браузер и сервер не смогут согласовать авторизацию.Как использовать Service Worker с BASIC Authentication (NTLM, Negotiate)

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

EDIT

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); 
     }) 
    ); 
}); 
+0

Этот вопрос/решение применяется для любого сайта, который использует обычную проверку подлинности, то м при условии, что название было обновлено. – SGD

+1

@SGD, что бы вы предложили для названия? что-то вроде «Как использовать Service Worker с BASIC Authentication» –

+0

Да, это в значительной степени то, что я действительно искал. – SGD

ответ

11

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

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

вы воспользовавшись неявный Requestobject creation (см. Раздел 6.4.4.4.1), который происходит, когда вы передаете строку в cache.add()/cache.addAll(). Созданный объект Request использует значение по умолчанию credentials mode, то есть '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 с:

var urls = ['page1.html', 'page2.html']; 
caches.open('my-cache').then(cache => { 
    return cache.addAll(urls.map(url => new Request(url, {credentials: 'same-origin'}))); 
}); 
+0

Спасибо Джефф, я проверю это. Вы точно поняли, что я делаю. Я добавил код к вопросу. –

+0

спасибо. Это именно то, что мне нужно! – Jespertheend