セキュアな運用のためのnameの指定の推奨について
Room リソースや Member リソースは、自動生成される ID とは別に、ユーザーがオプショナルな値として指定できる Name を持っています。SkyWay では、リソースを作成する際に Name の指定を推奨しています。
Room ライブラリによるサンプルコードを以下に示します。
const room = await SkyWayRoom.Create(context, {
name: "lesson-room-1",
});
const me = await room.join({ name: "alice" });各リソースの ID は、リソース作成後に払い出されます。
そのため、リソース作成時に利用する SkyWay Auth Token の id にはワイルドカード( * )を指定する必要があり、操作する対象のリソースを厳密に制限できません。
一方、各リソースの Name はリソース作成前にユーザー側で決めることができます。そのため、name を指定することで操作対象のリソースを厳密に制限した SkyWay Auth Token を作成できます。
以下のようにリソース作成より前に権限の認可条件を指定することで、よりセキュアにアプリケーションを運用できます。
// SkyWay Auth Token version 1 または 2 の場合
scope: {
app: {
id: "sample-app-id",
actions: ["read"],
channels: [
{
name: "lesson-room-1",
actions: ["create", "delete"],
members: [
{
name: "alice",
actions: ["create", "delete"],
publication: {
actions: ["create", "delete"]
},
subscription: {
actions: ["create", "delete"]
}
}
],
},
]
}
}// SkyWay Auth Token version 3 の場合
scope: {
appId: "sample-app-id",
rooms: [
{
name: "lesson-room-1",
methods: ["create", "close", "updateMetadata"],
member: {
name: "alice",
methods: ["publish", "subscribe", "updateMetadata"]
}
}
]
}ワイルドカードの利用について
SkyWay Auth Token における Room リソースや Member リソースの name プロパティには、ワイルドカードを利用することができます。
ワイルドカードを利用する場合には version を 2 以上に設定する必要があります
例えば、student-room-1 や student-room-2 には入ることができるが、teacher-room-1 には入れない、という SkyWay Auth Token を上記の alice のために作成する場合は以下のように作成します。
// SkyWay Auth Token version 2 の場合
{
jti: "aa15ef18-08a4-4755-a9be-9f2d3351465e",
iat: 1577804400,
exp: 1577904400,
version: 2,
scope: {
app: {
id: "sample-app-id",
actions: ["read"],
channels: [
{
name: "student-room-*", // ワイルドカードを利用
actions: ["create", "delete"],
members: [
{
name: "alice",
actions: ["create", "delete"],
publication: {
actions: ["create", "delete"]
},
subscription: {
actions: ["create", "delete"]
}
}
],
},
]
}
}
}// SkyWay Auth Token version 3 の場合
{
jti: "aa15ef18-08a4-4755-a9be-9f2d3351465e",
iat: 1577804400,
exp: 1577904400,
version: 3,
scope: {
appId: "sample-app-id",
rooms: [
{
name: "student-room-*", // ワイルドカードを利用
methods: ["create", "close", "updateMetadata"],
member: {
name: "alice",
methods: ["publish", "subscribe", "updateMetadata"]
}
}
]
}
}