如何使用具有基本身份验证的 Service Worker(NTLM、协商)
How to use a Service Worker With BASIC Authentication (NTLM, Negotiate)
我一直在尝试在 IIS 托管网站中使用 service worker 来缓存网站的一些静态内容。该站点是使用 Windows 身份验证的内部应用程序。我已经能够毫不费力地注册和 运行 一个服务工作者,但是一旦我打开缓存并开始向缓存添加文件,承诺就会因授权失败而失败。返回的 HTTP 结果是 401 Unauthorised。在浏览器和服务器能够协商授权之前,这是前几个请求的通常响应。
我会很快 post 一些代码来帮助解释。
编辑
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);
})
);
});
鉴于缺少代码,这只是一个猜测,但如果您正在做类似的事情:
caches.open('my-cache').then(cache => {
return cache.add('page1.html'); // Or caches.addAll(['page1.html, page2.html']);
});
您正在利用隐式 Request
object creation (see section 6.4.4.4.1) that happens when you pass in a string to cache.add()
/cache.addAll()
. The Request
object that's created uses the default credentials mode,即 'omit'
.
您可以做的是显式构造一个 Request
对象,其中包含您喜欢的凭据模式,在您的情况下可能是 'same-origin'
:
caches.open('my-cache').then(cache => {
return cache.add(new Request('page1.html', {credentials: 'same-origin'}));
});
如果您有一堆要将数组传递给 cache.addAll()
的 URL,您可以 .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'})));
});
我一直在尝试在 IIS 托管网站中使用 service worker 来缓存网站的一些静态内容。该站点是使用 Windows 身份验证的内部应用程序。我已经能够毫不费力地注册和 运行 一个服务工作者,但是一旦我打开缓存并开始向缓存添加文件,承诺就会因授权失败而失败。返回的 HTTP 结果是 401 Unauthorised。在浏览器和服务器能够协商授权之前,这是前几个请求的通常响应。
我会很快 post 一些代码来帮助解释。
编辑
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);
})
);
});
鉴于缺少代码,这只是一个猜测,但如果您正在做类似的事情:
caches.open('my-cache').then(cache => {
return cache.add('page1.html'); // Or caches.addAll(['page1.html, page2.html']);
});
您正在利用隐式 Request
object creation (see section 6.4.4.4.1) that happens when you pass in a string to cache.add()
/cache.addAll()
. The Request
object that's created uses the default credentials mode,即 'omit'
.
您可以做的是显式构造一个 Request
对象,其中包含您喜欢的凭据模式,在您的情况下可能是 'same-origin'
:
caches.open('my-cache').then(cache => {
return cache.add(new Request('page1.html', {credentials: 'same-origin'}));
});
如果您有一堆要将数组传递给 cache.addAll()
的 URL,您可以 .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'})));
});