Open4

nest: WebPushというかFCMでシグナリングできないか問題

okuokuokuoku

デバイス ←→ Webブラウザ のp2pはHTTP経由で行けることは解ったけど、Webブラウザ同士は今のところ解が無い。

ステートレスなWebアプリをCloudflare Workersにでも置いて、FCM(Firebase Cloud Messaging)でWeb Pushを送ることでブラウザ同士のシグナリングに使えないだろうか。

https://firebase.google.com/docs/cloud-messaging?hl=ja

okuokuokuoku

abuse対策

CloudflareはCAPTCHA代替のTurnstile https://developers.cloudflare.com/turnstile/ を提供していて、それがワンタイムトークン(使いきりのトークン)を提供している。これを使うことで、Web Push送信エンドポイントをダミーデータで何度も叩いて無駄トラフィックを発生させることは防げる。

... が、そもそもCloudflare workersは無料枠でもDailyで10万件とかのリクエスト枠があるので問題にならないのではないか。

FCMは完全に無料のサービスなので、想定するような使い方では呼出し回数は特に問題にならない。直接チャットに使っても無料。

okuokuokuoku

プロトコル

  • A: 発信側(Webアプリ)
  • B: 着信側(Webアプリ)
  • N: サービス(Cloudflare Workers)
  1. B はFCMにサブスクライブし登録トークン(Registration token) PをFCM SDK経由で得る
  2. B は登録トークンをNに送信し、署名暗号化された登録トークンE(P)を得る
  3. B はオフラインで登録トークンE(P)をAに渡す
  4. A はE(P)とペイロードをNに送信し、Web Pushさせる
  5. N はE(P)を検証してPを取り出し、FCMにリクエストを送出する

FCMにおけるペイロードは4000バイトに制限されているので、場合によっては複数個のメッセージに分割する必要がある。

AとBは事前に公開鍵を交換しておき、ペイロードを相互に署名しておく必要がある。E(P)は他のユーザーにも共通の値となるため。

okuokuokuoku

古い登録トークンを始末する

https://firebase.google.com/docs/cloud-messaging/manage-tokens?hl=ja

ドキュメントでは、登録トークンを別途DBに入れることを推奨している。今回はこれをやらないつもりなので、古いトークンは永久にFCM側に残ることになる。

... まぁ別に良いんじゃないですかね多分。。Googleのスケーラビリティを信じるって事で。。