Serviceworker与HTTP基本身份验证冲突?

24
我正在尝试保护一个处于早期开发阶段的网站免受随意窥探。基本身份验证加上HTTPS似乎是一个合理的解决方案,但服务工作者的存在似乎阻止了它在Chrome中的工作。这种情况特别发生在服务工作者已经安装,但浏览器没有对所需领域进行活动授权时。

Chrome显示在网络时间轴中的响应为401错误。

401 in Network timeline

同时也显示浏览器标签页正在接收正确的响应头:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="My realm"
Date: Tue, 21 Jun 2016 03:09:35 GMT
Connection: close
Cache-Control: no-cache

但它不会提示登录,只显示401响应的内容主体。
这是Chrome的一个bug吗,还是我的ServiceWorker可能有问题?

Chrome如何知道在服务工作者请求中发送身份验证标头? - Rick Viscomi
@RickViscomi服务工作者不应该,但是选项卡应该,对吧?我认为SW应该是这个过程中一个不关心的中间盒子。 - Andrew
2个回答

13

1
从错误跟踪器中:我认为显示身份验证对话框的预期行为永远不会发生,因为服务工作者可以随时运行,并且在奇怪的时间弹出对话框看起来像“魔术”。讨论: https://github.com/w3c/ServiceWorker/issues/119 - Xander Luciano

8
这是因为fetch()选项不幸地默认为'omit'凭据。您需要使用{'credentials': 'same-origin'}进行fetch()。请观察GitHub pull request
如果您正在使用add()addAll(),则需要传递请求对象。 示例:
cache.addAll(
  cacheUrls.map(url => new Request(url, {credentials: 'same-origin'}))
);

4
谢谢!我在我的服务工作线程中使用fetch(request),添加一行代码request.credentials = "same-origin"解决了这个问题。 - Sunny
不再适用于Chrome 83。请参见https://bugs.chromium.org/p/chromium/issues/detail?id=623464#。 - Nux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接