本文へ移動

SkyWay版のしくみ ​

SkyWay版では、参加者どうしがSkyWayを使って、ブラウザ同士で直接つながります(P2P)。画像と音声も、持っている人から直接受け取ります。SkyWayにつなぐには認証トークンが要り、それを作って渡すのがトークン発行サーバーです。

トークン発行サーバーは、PHP版・Vercel版・Cloudflare版のどれか1つを置きます。どれも、Axeから見て同じように動きます(選びかたはどれを置くか)。

置き場所手順
Vercel(いちばん手軽)Vercelに置く
借りているレンタルサーバーレンタルサーバーに置く(PHP版)
Cloudflare WorkersCloudflareに置く

どれも、先にSkyWayのアプリを作るが要ります。

このページでは、トークン発行サーバーが作るトークンの中身と、安全のために入れている制限を説明します。設置するだけなら読まなくても構いませんが、設定の意味やエラーの理由を知りたいときに役立ちます。

流れ ​

  1. Axe部屋に入る前に、許可証(トークン)を頼む
  2. トークン発行サーバーシークレットキーで署名したトークンを返す
  3. SkyWayトークンを見て、参加者どうしをつなぐ
  1. Axeは部屋に入る前に、トークン発行サーバーへPOST /v1/skyway2023/tokenを送ります。本文には、入りたい部屋のチャンネル名と、自分のピアIDが入っています。
  2. サーバーはリクエストを確かめ、SkyWayのシークレットキーで署名したトークン(JWT)を返します。
  3. Axeはそのトークンを使ってSkyWayにつながり、ロビーと部屋のチャンネルに入ります。

Axeは最初にGET /v1/statusでサーバーが動いているかを確かめます。つながらないときや一時的なエラー(5xx・408・429)のときは、間を置いて何度か試し直します。起動直後のサーバー(Vercelのコールドスタートなど)で最初の1回が失敗しても、たいていは試し直しで通ります。

トークンの中身 ​

トークンには、SkyWayに対して「このピアに何を許すか」が書かれています。3つの版は、同じ中身のトークンを作ります。

項目値
署名方式HS256(SkyWayのシークレットキーで署名)
jti発行ごとのランダムなID(UUID v4)
iat発行した時刻
exp有効期限。PHP版は発行から24時間、Vercel版とCloudflare版は既定24時間(変えられる)
version2
アプリSkyWayのアプリID。TURNサーバーの利用を許可
チャンネルロビーと、指定された部屋の2種類(下の表)

チャンネルごとの権限 ​

チャンネル名前自分(ピアID)にできることほかのメンバーへの許可
ロビーudonarium-lobby-*-of-<ロビーの数>チャンネルを見る・作る・入る。データは送受信しないなし
部屋リクエストのchannelNameチャンネルを見る・作る・入る。データを送受信するシグナリングだけ
  • ロビーは、部屋の一覧を見るためのチャンネルです。データのやりとりは許していません。
  • 部屋は、実際に遊ぶチャンネルです。自分のピアIDでだけ、データを送ったり受け取ったりできます。

ロビーの数 ​

ロビーの名前の*には、1から<ロビーの数>までの番号が入ります。Axeはトークンに書かれた名前からロビーの数を読み取り、1番から順に見て、300人に満たないロビーに入ります。

ロビーの数は、どの版もSKYWAY_UDONARIUM_LOBBY_SIZEで決めます(既定は3)。同時にロビーにいる人が多い(数百人を超える)ときは増やします。

同じSkyWayアプリを複数のサーバーで使うとき

ロビーの数は、同じSkyWayアプリを使うすべてのトークン発行サーバーでそろえてください。数が違うと、サーバーごとに見えるロビーが変わり、同じ部屋一覧を見られなくなります。

安全のための制限 ​

SkyWayは、チャンネル名やメンバー名の*を「何にでも一致する」ワイルドカードとして、\をその打ち消しとして扱います。リクエストの値をそのまま使うと、たとえばchannelNameに*を渡すだけで、すべての部屋に入れるトークンができてしまいます。

どの版も、これを防ぐために次のリクエストを400で断ります。

  • channelNameまたはpeerIdが空、または200バイトを超える
  • channelNameまたはpeerIdに*か\が含まれる
  • channelNameがudonarium-lobby-で始まる(ロビーの名前を部屋として使い、ロビーにデータ送受信の権限を得るのを防ぐため)
  • formatVersionが1でない

Originの確認(CORS) ​

トークン発行サーバーは、ACCESS_CONTROL_ALLOW_ORIGINに書いたOriginのページからのリクエストだけを受けます。

  • Originヘッダーがないリクエストは400で断ります。
  • 許可していないOriginからのリクエストは403で断ります。
  • ブラウザのプリフライト(OPTIONS)にも答えるので、AxeはContent-Type: application/jsonを付けて送れます。

ただし、Originヘッダーはブラウザ以外(curlなど)からなら好きな値を付けられます。Originの確認は、ほかのサイトに置かれたAxeからあなたのサーバーが使われるのを防ぐためのもので、すべての不正な利用を止めるものではありません。

次に読むもの ​

MITライセンスで公開しています