Skip to content

Commit

Permalink
feat: 新しいSkyWayによる通信処理クラス群
Browse files Browse the repository at this point in the history
**概要**
`Network`クラス内でオブジェクト化している`SkyWayConnection`クラスの実装を
現在の"src\app\class\core\system\network\skyway\skyway-connection.ts"から
新規実装した"src\app\class\core\system\network\skyway2023\skyway-connection.ts"に
切り替えることで新しいSkyWayを使用した通信処理が可能になる.

**制約**
- 新しいSkyWayのChannelの概念の都合からユドナリウムのプライベート接続をオミットしている.
- 現状のコードはバックエンドのモック実装を含んでおりセキュリティ的に問題があるため本番環境で使用してはならない.(詳細は下記)

**シークレットキーの取り扱いについて**
新しいSkyWayはJWTによる権限管理を行っており、JWTの署名に使用するシークレットキーはクライアントに秘匿される必要がある.
しかし、現状のコードではバックエンド処理(`SkyWayBackend`)がモックとなっておりシークレットキーが秘匿されないため危険である.
安全に運用するためにはJWTを発行するWeb APIなどの準備が別途必要.
  • Loading branch information
TK11235 committed Nov 15, 2023
1 parent 56ab91f commit 1bf7d86
Show file tree
Hide file tree
Showing 8 changed files with 1,736 additions and 11 deletions.
438 changes: 427 additions & 11 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"@angular/platform-browser": "^15.2.8",
"@angular/platform-browser-dynamic": "^15.2.8",
"@angular/router": "^15.2.8",
"@skyway-sdk/core": "^1.4.1",
"base-x": "^4.0.0",
"bcdice": "^4.2.0",
"crypto-js": "^4.1.1",
Expand Down
93 changes: 93 additions & 0 deletions src/app/class/core/system/network/skyway2023/skyway-backend.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { ChannelScope, nowInSec, SkyWayAuthToken, uuidV4 } from '@skyway-sdk/core';

export namespace SkyWayBackend {
export async function createSkyWayAuthToken(appId: string, channelName: string, peerId: string): Promise<string> {
return createSkyWayAuthTokenMock(appId, channelName, peerId);
}
}

/**
* SkyWayAuthTokenを生成するモック実装.
*
* **シークレットキーはフロントエンドでは秘匿されている必要があります. この実装を本番環境で運用しないでください.**
*
* サーバを構築せずにフロントエンドでSkyWayAuthTokenを生成した場合、
* シークレットキーをエンドユーザが取得できるため、誰でも任意のChannelやRoomを生成して参加できる等のセキュリティ上の問題が発生します.
*
* @param appId アプリケーションID
* @param channelName 接続するチャンネルの名称
* @param peerId PeerId
* @returns JWT
*/
async function createSkyWayAuthTokenMock(appId: string, channelName: string, peerId: string): Promise<string> {
// モック実装のため、アプリケーションIDとシークレットキーは固定値
// 本番環境ではシークレットキーをサーバなどに置いて秘匿する
const _appId = '<SkyWay2023 Application ID>';
const _secret = '<SkyWay2023 Secret key>';

const _lobbySize = 4;

let lobbyChannels: ChannelScope[] = [];
for (let index = 0; index < _lobbySize; index++) {
lobbyChannels.push({
name: `udonarium-lobby-${index}`,
actions: ['read', 'create'],
members: [
{
name: peerId,
actions: ['write'],
publication: {
actions: [],
},
subscription: {
actions: [],
},
},
],
});
}

let roomChannels: ChannelScope[] = [];
roomChannels.push({
name: channelName,
actions: ['read', 'create'],
members: [
{
name: peerId,
actions: ['write'],
publication: {
actions: ['write'],
},
subscription: {
actions: ['write'],
},
},
{
name: '*',
actions: ['signal'],
publication: {
actions: [],
},
subscription: {
actions: [],
},
},
],
});

let token = new SkyWayAuthToken({
jti: uuidV4(),
iat: nowInSec(),
exp: nowInSec() + 60 * 60 * 24,
scope: {
app: {
id: _appId,
turn: false,
actions: ['read'],
channels: lobbyChannels.concat(roomChannels),
},
},
}).encode(_secret);

return token;
}
Loading

0 comments on commit 1bf7d86

Please sign in to comment.