SkyWay版のしくみ
SkyWay版では、参加者どうしがSkyWayを使って、ブラウザ同士で直接つながります(P2P)。画像と音声も、持っている人から直接受け取ります。SkyWayにつなぐには認証トークンが要り、それを作って渡すのがトークン発行サーバーです。
トークン発行サーバーは、PHP版・Vercel版・Cloudflare版のどれか1つを置きます。どれも、Axeから見て同じように動きます(選びかたはどれを置くか)。
| 置き場所 | 手順 |
|---|---|
| Vercel(いちばん手軽) | Vercelに置く |
| 借りているレンタルサーバー | レンタルサーバーに置く(PHP版) |
| Cloudflare Workers | Cloudflareに置く |
どれも、先にSkyWayのアプリを作るが要ります。
このページでは、トークン発行サーバーが作るトークンの中身と、安全のために入れている制限を説明します。設置するだけなら読まなくても構いませんが、設定の意味やエラーの理由を知りたいときに役立ちます。
流れ
- Axe部屋に入る前に、許可証(トークン)を頼む
- トークン発行サーバーシークレットキーで署名したトークンを返す
- SkyWayトークンを見て、参加者どうしをつなぐ
- Axeは部屋に入る前に、トークン発行サーバーへ
POST /v1/skyway2023/tokenを送ります。本文には、入りたい部屋のチャンネル名と、自分のピアIDが入っています。 - サーバーはリクエストを確かめ、SkyWayのシークレットキーで署名したトークン(JWT)を返します。
- 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時間(変えられる) |
version | 2 |
| アプリ | 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からあなたのサーバーが使われるのを防ぐためのもので、すべての不正な利用を止めるものではありません。