Firefox: Service Worker: SecurityError: DOMException: The Operation is insecure

Firefox: Service Worker: SecurityError: DOMException: The Operation is insecure

app.js中, 我正在检查导航器对象中是否存在 serviceWorker,如果可用则注册 SW。

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('./service-worker.js', { scope: './' })
        .then(function(registration) {
            console.log("Service Worker Registered!");
        }).catch(function(err) {
            console.log("Service Worker not registered!", err);
        });
}

尝试注册 SW 时,我在 Firefox 中收到以下错误。我还确保 service-worker.js 文件位于 src 目录下。

在 Firefox(版本 59.0.2)中检查我的 about:config 我启用了服务工作者和存储 api。所以这应该不是问题。

PS:相同的代码在 Chrome.

上运行良好

你有没有检查about:preferences#privacy中的cookie设置,它必须是'keep until they expire',如果你'keep until I close firefox'选择了sw将不会注册。

您可以在此线程中找到详细信息: https://bugzilla.mozilla.org/show_bug.cgi?id=1429714

您可以保持选中“关闭 Firefox 时删除 cookie 和站点数据”,只要您为站点创建例外。 (在 Firefox 78.0.2 中测试):

单击 管理权限... 并输入 URL(例如 localhost:8000)。点击允许,然后点击右下角的保存更改。服务人员(和 cookie 等)现在应该为这个 URL 工作,但不为其他 URL 工作。

开发者,请注意 localhost 与例如localhost:8000(需要指定端口号)

对于 Firefox 80,我转到 about:Config 并验证 dom.serviceWorkers.enabled 设置为 true

然后我从 Mozilla 转到 about:preferences#privacy 并取消选中 Delete cookies and site data when Firefox is closed

如果 serviceworker 的文件使用错误的 MIME 类型传送,同样的错误消息也会出现在 Firefox 中。在这种情况下,设置正确的 MIME 类型可以解决问题。如果您动态地传送 serviceworker 的文件,例如,可能会发生错误的 MIME 类型使用 PHP.

正确的 MIME 类型必须是

Content-Type: application/javascript; charset=UTF-8

当您提供 Service Worker 文件本身时,通常需要使用 Service-Worker-Allowed http header 来托管它。如果此 header 的值与您在 Javascript 中尝试注册 Service Worker 的值不匹配,或者如果您尝试注册的范围超出浏览器认为的范围 'secure',那么你会得到这个错误。

不止一次发生在我身上,我每次都在这里结束。至少我下次能帮到自己!

在我的例子中,我删除了与该站点相关的所有先前数据(cookie、缓存等)。然后,Firefox 允许我注册新的 service worker。

在我的例子中,错误 DOMException: The Operation is insecure 在调用 navigator.credentials.create() 时发生。

以下是一些可能的原因:

  • 本地 XAMPP apache 被寻址为 127.0.0.1 而不是 localhost。 WebAuthn 不喜欢 IP 地址。
  • 我的环境使用 HTTP 而不是 HTTPS。
  • 我为 HTTP 使用了自定义端口,请参阅

使用 https://localhost/ 和 self-signed(XAMPP 默认值)证书,而不是 http://127.0.0.1:82/,错误已解决。