私は ngrok を使用して、ローカル IP (Google Colab にあるため、実際にはそうではありません) をパブリック IP にトンネリングしました。
ngrok コンソールに移動すると、作成されたすべてのトンネルが表示されます。localhost:port 用のトンネルを 1 つだけ作成しましたが、ここには 2 つあり、1 つは HTTP 用で、もう 1 つは HTTPS 用です (いいですね?)。
Web アプリの https アドレスにアクセスすると、コンソールに
しかし、httpアドレスにアクセスすると、コンソールに表示されます
Q:トンネルを介してリモート マシンへの HTTP を必要とする Service Worker と連携できますか?
A:どうやらそうです!
その登録の背後にあるコードは次のとおりです (失敗した場所を知ることが重要です)。
// Here we register the SERVICE WORKER
IndexController.prototype._registerServiceWorker = function() {
console.log("1.Starting SW function.");
if (!navigator.serviceWorker) {
console.log("2.Browser is NOT compatible with SW or something is not working.");
return; }
console.log("2.Browser is compatible with SW.");
navigator.serviceWorker.register('/sw.js').then(function() {
console.log('3.Registration worked!');
}).catch(function() {
console.log('3.Registration failed!');
});
};
さらに複雑にするために、Service Workers を使用する私の Web アプリは Colab ( Google Colab ) 内で実行されています。Web アプリは、Colab 内の Node.js で実行されています。
localhost から作業している場合は、(理論によれば) localhost への接続時に https 要件が適用されないため、より簡単になるはずです。[A] と[B]
ローカルホストで実行されているという理由だけで、ブラウザーがアプリに適しているというわけではありません。
注:上記の私の実験..
- Firefox: 以下の設定の有無にかかわらず動作しました。
- Chrome:ホワイトリストにURLを追加して再起動せずに取得しました
私が得たhttps Webアプリに行く:
IndexController.js:49 Mixed Content: The page at 'https://0a4e1e0095b0.ngrok.io/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://0a4e1e0095b0.ngrok.io/updates?since=1602934673264&'. This request has been blocked; this endpoint must be available over WSS.
IndexController._openSocket @ IndexController.js:49
IndexController @ IndexController.js:10
(anonymous) @ index.js:16
loadScripts @ loadScripts.js:5
46.../utils/loadScripts @ index.js:15
s @ _prelude.js:1
e @ _prelude.js:1
(anonymous) @ _prelude.js:1
IndexController.js:49 Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
at IndexController._openSocket (https://0a4e1e0095b0.ngrok.io/js/main.js:2251:12)
私が得たhttp Webアプリに行く:
Navigated to http://0a4e1e0095b0.ngrok.io/
IndexController.js:17 1.Starting SW function.
IndexController.js:19 2.Browser is NOT compatible with SW or something is not working.
localhost 上になく、https を使用できない場合は、ブラウザーでこれらの設定を変更する必要がある場合があります。
すでに説明した人もいますが、ここでもう一度。
クロム:
- chrome://flags/#unsafely-treat-insecure-origin-as-secure に移動します
- ホワイトリストに登録する URL を追加します。
- クロームを再起動
これにより、すべてのChrome ウィンドウが再起動されることに注意してください。トンネルが作成されるたびに名前が変更され、毎回多数のウィンドウを再起動できないため、これは私にとっては解決策ではありません。
ファイアフォックス / ウォーターフォックス
- 開発者ツールを開く
- 設定を開く
- 「HTTP 経由で Service Worker を有効にする (ツールボックスが開いている場合)」をマークします。
Firefox/Waterfox
おそらく以下の変更を行う必要はありませんが、私は変更しました (私のブラウザは少し古いかもしれません)。詳細はこちら。
about:config で
有効にしました
dom.serviceWorkers.testing.enabled
dom.serviceWorkers.enabled
このhttps://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workersおよび同じサイトの関連ページを参照することを強くお勧めします。
ngrok のセットアップに興味がある場合は、非常に簡単です (python バージョン)。
# Install pyngrok python package on your Google Colab Session
!pip install pyngrok
# Set up your ngrok Authtoken (requires free registration)
!ngrok authtoken YOUR_TOKEN_HERE
# Invoke ngrok from Python and start tunneling/connecting
from pyngrok import ngrok
# Open a HTTP tunnel on the default port 80 if not specified
ngrok_tunnel = ngrok.connect('8888')
# You can print it, or go to the ngrok console on https://dashboard.ngrok.com/status/tunnels
print (ngrok_tunnel.public_url)