WebRTC Signaling Server Ayame をクラウドサービスとして利用できるようにしたいという思いがあったのですが、認証部分とかがかなり面倒なのでどうしたものかと考えていましたが、こんな感じでどうかなというのが決まったので書いていきます。
SDK でのシグナリングキー指定
Ayame Web SDK をそのまま利用できるようにします。
SDK 自体にシグナリング認証用の key を追加しますが、クラウド向けというのは用意する必要はありません。key 自体も Ayame を自社で管理するときの認証にも使えると思います。
const conn = Ayame.connection('wss://example.com:3000/ws', 'voluntas@test-room', {key: 'eWd8zP3Ma}JVrgoCthmWUNratMPk;HKY'});
const startConn = async () => {
const mediaStream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
const stream = await conn.connect(mediaStream);
conn.on('disconnect', (e) => console.log(e));
conn.on('addstream', (e) => {
document.querySelector('#remote-video').srcObject = e.stream;
});
document.querySelector('#local-video').srcObject = stream;
};
startConn();
二段階認証
認証は二段階認証を用意します。
シグナリングキーとルーム ID の確認
一段目はクラウドサービス側でシグナリングキーとルーム ID の結びつきを確認します。
ルーム ID は必ず GitHub ID が先頭にくる必要があります。例えば ID が voluntas なら voluntas@abc123 という感じでルーム ID を生成する必要があります。
一段目認証はこの GitHub ID とシグナリングキーの整合性のみチェックします。
利用者が自由に認証を行う
二段目は利用者が指定した認証ウェブフック URL を利用することができます。つまりクラウドサービス側ではなく、利用者が自由に認証を行うことができます。
クラウドサービスは一段目の認証が成功し、認証ウェブフックが指定されていた場合は、その URL に対して認証の通知を行います。その戻り値で最終的に認証の合否を判断します。
リクエストに含まれているホスト情報やいろいろな情報を通知するので指定したドメインから利用されていなかったりした場合に弾いたりすることが出来きます。
TURN サーバの提供
Ayame には TURN サーバ向けの username / credential を払い出す機能を追加する予定です。これは認証成功時に払い出します。この値を使って TURN-UDP / TCP / TLS に接続を可能にします。
TURN サーバ用の username / credential は 1 時間で無効にする予定です。また TURN サーバ側で帯域も絞り映像のビットレートは 300kbps まで落とすことで TURN サーバ側の負荷を減らします。
無料で無保証
GitHub アカウントさえ持っていれば無料で利用可能にします。ただし無保証です、シグナリングサーバが落ちてるという可能性もあります。
Ayame はオープンに公開されているので、落ちるのが怖い場合は自前で立てることで回避可能です。
接続数と転送量の制限なしで無保証
気になる接続数と転送量の制限は持たせない予定です。
接続数に関してはリバースプロクシによるポート枯渇がありますが、流石にそれほどつないでくるとは思えないので、心配してません。
転送量も TURN サーバは帯域を絞り、 TURN 利用は 10–20 % 程度なので、そんなに転送量が問題になることはないと思っています。問題になったら考えます。
メタデータ
認証と承認にメタデータを指定できるようにしたいと考えています。
認証メタデータ
SDK に authnMetadata という項目を用意し JSON 値を指定できるようにする予定です。この値に対してはクラウドサービス自体は関与しません。
そのかわり二段階認証で利用者が用意した認証サーバにリクエストを送る時に authnMetadata を含むようにします。
const conn = Ayame.connection('wss://example.com:3000/ws', 'voluntas@test-room', {key: 'eWd8zP3Ma}JVrgoCthmWUNratMPk;HKY', authnMetadata: {username: 'voluntas'}});
この値を利用することで利用者は気軽に認証を行うことが可能になります。
承認メタデータ
利用者は認証成功時のレスポンスに authzMetadata という項目で JSON 値を好きに払い出すことができます。
この値が送られてきた場合 SDK 側でコールバックを書けますので、好きに指定が可能です。例えば username を認証サーバから送ったりということも可能になります。
{"allowed": true, "authzMetadata": {"username": "voluntas"}}
まとめ
7 月から本格的に開発を進めていく予定です。
Ayame は WebRTC Native Client Momo でも利用できるようにしていく予定です。WebRTC SFU Sora とはまた別方向の 1 対 1 で P2P に特化した仕組みは色々な場面で使えると思います。