Open4
nest: WebPushというかFCMでシグナリングできないか問題
デバイス ←→ Webブラウザ のp2pはHTTP経由で行けることは解ったけど、Webブラウザ同士は今のところ解が無い。
ステートレスなWebアプリをCloudflare Workersにでも置いて、FCM(Firebase Cloud Messaging)でWeb Pushを送ることでブラウザ同士のシグナリングに使えないだろうか。
abuse対策
CloudflareはCAPTCHA代替のTurnstile https://developers.cloudflare.com/turnstile/ を提供していて、それがワンタイムトークン(使いきりのトークン)を提供している。これを使うことで、Web Push送信エンドポイントをダミーデータで何度も叩いて無駄トラフィックを発生させることは防げる。
... が、そもそもCloudflare workersは無料枠でもDailyで10万件とかのリクエスト枠があるので問題にならないのではないか。
FCMは完全に無料のサービスなので、想定するような使い方では呼出し回数は特に問題にならない。直接チャットに使っても無料。
プロトコル
- A: 発信側(Webアプリ)
- B: 着信側(Webアプリ)
- N: サービス(Cloudflare Workers)
- B はFCMにサブスクライブし登録トークン(Registration token) PをFCM SDK経由で得る
- B は登録トークンをNに送信し、署名暗号化された登録トークンE(P)を得る
- B はオフラインで登録トークンE(P)をAに渡す
- A はE(P)とペイロードをNに送信し、Web Pushさせる
- N はE(P)を検証してPを取り出し、FCMにリクエストを送出する
FCMにおけるペイロードは4000バイトに制限されているので、場合によっては複数個のメッセージに分割する必要がある。
AとBは事前に公開鍵を交換しておき、ペイロードを相互に署名しておく必要がある。E(P)は他のユーザーにも共通の値となるため。
古い登録トークンを始末する
ドキュメントでは、登録トークンを別途DBに入れることを推奨している。今回はこれをやらないつもりなので、古いトークンは永久にFCM側に残ることになる。
... まぁ別に良いんじゃないですかね多分。。Googleのスケーラビリティを信じるって事で。。