PlayFab パーティーの招待とセキュリティ モデル
PlayFab パーティーは、既定でセキュリティ保護された通信環境を提供するように設計されています。 これはゲームやプレイヤーの保護に役立ちますが、セキュリティ上の制限があると、開発者にとっては API の使用方法に疑問が生じます。 このページでは、PlayFab パーティーのセキュリティ機能について説明します。主に招待と、それらを使用するための効果的なパターンに焦点を当てています。
PlayFab パーティーでは、すべての通信 (管理データ、ゲーム データ、リアルタイム通信) に業界標準の暗号化と認証を使用しています。 これには、すべてのピア ツー ピアの通信、Web サービス (HTTPS を使用)、または透過型クラウド リレー サービス (DTLS を使用) などの Azure サービスへのすべてのトランザクションが含まれます。
ネットワークへのアクセス制限は、ネットワークの整合性を保護するための重要な部分です。 ネットワークに参加するには、次の 4 つのことが必要です。
- ネットワーク記述子に関する知識
- 有効な PlayFab
title_player_account
エンティティ トークンの所有 - 招待識別子に関する知識
- 指定された招待にトークンの PlayFab エンティティ ID が含まれていること、または指定された招待がオープンな招待であること。
特定の PlayFab パーティー ネットワークには、最大 32 人のプレイヤーを含めることができます。
招待
招待 (PartyInvitation
) は、ユーザーにネットワークへのアクセスを許可するネットワーク内のオブジェクトです。 招待は、ネットワークの有効期間を通じて作成と取り消しが可能です。 招待には、作成者、一意の識別子、取り消し可能性設定、任意のユーザーのセットがエンティティ ID として指定されています。 ネットワークには、有効な招待がいくつあっても構いませんし、ない場合もあります。 ネットワークは常に最初の招待で作成されます。
招待の有効期間
招待は、作成された時点から取り消されるまで有効です。
作成
招待を作成するには、次の 2 つの方法があります。 最初の方法は PartyManager::CreateNewNetwork()
を呼び出す方法です。 ネットワークに参加するには招待が必要であるため、ネットワークの作成時に存在する必要があります。 この招待は最初の招待と呼ばれ、以下の説明の通りいくつかの特別なプロパティがあります。 次の方法は PartyNetwork::CreateInvitation()
を呼び出す方法です。
招待の作成者は、PartyNetwork::CreateInvitation()
を呼び出すときに指定されたユーザーです。 最初の招待には作成者がいません。
招待が作成されると (または有効な初期招待があるネットワークに参加すると)、PartyInvitationCreatedStateChange
が生成されます。
Important
最初の招待では、ネットワークの作成者が暗黙的に参加することはできません。 オープンな招待が使用されている場合を除き、必ず作成者のエンティティ ID をユーザー一覧に含めます。
列挙型
有効な招待の列挙は、PartyNetwork::GetInvitations()
を使用して行われます。 ローカル デバイスで作成された招待と、最初の招待がまだ有効な場合は、その招待のみを列挙することができます。
無効化
PartyNetwork::RevokeInvitation()
を呼び出すと、招待が取り消されます。 招待を取り消すことができるのは、招待の作成者だけです。ただし、最初の招待はユーザーによって取り消される可能性があります。 また、招待を作成したユーザーがネットワークから削除されると、招待は自動的に取り消されます。
招待が取り消されると、招待を表示できるすべてのデバイスで PartyInvitationRevokedStateChange
が生成されます。
最初の招待が一旦取り消されると、それをもう一度作成することはできません。 その識別子は新しい招待に再利用できますが、その新しい招待には最初の招待に含まれていた特別なプロパティが含まれることはありません。
Important
招待を取り消しても、既にネットワークに参加しているデバイスとユーザーには影響しません。 ネットワークからユーザーまたはデバイスを削除するには、PartyNetwork::KickUser()
または PartyNetwork::KickDevice()
を使用します。 これらのメソッドはまだ実装されていないことに注意してください。
招待の構成
招待の構成は、作成時に PartyInvitationConfiguration
構造体を使用して指定されます。
識別子
各招待には、ネットワーク内で一意に識別する識別子があります。 招待の作成時に識別子が指定されていない場合、パーティーによって割り当てられます。
PartyManager::CreateNewNetwork()
への呼び出しの場合、割り当てられた識別子は out パラメーターで返され、ネットワークの作成が完了したときに PartyCreateNewNetworkCompletedStateChange
にも報告されます。
PartyManager::CreateInvitation()
の呼び出しの場合、割り当てられた識別子は、招待の作成が完了した時点で、invitation
outパラメータまたは PartyCreateInvitationCompletedStateChange
の invitation
フィールドから取得できます。
招待識別子は一意である必要がありますが、招待を取り消した後、新しい招待を作成するときにその識別子を再利用できます。
最初の招待とその他の招待
招待の種類は 1 つだけですが、PartyManager::CreateNewNetwork()
の呼び出しで作成された最初の招待は、後に PartyNetwork::CreateInvitation()
を介して作成された招待とは少し異なります。 その違いを次の表にまとめます。
プロパティ | 最初の招待 | その他の招待 |
---|---|---|
表示 | すべてのデバイスで最初の招待を確認できます。 最初の招待が取り消されていない限り、PartyNetwork::GetInvitations() への呼び出しは最初の招待を返します。 ネットワークに参加すると、各デバイスは、最初の招待が以前に取り消されていなければ、最初の招待に対して PartyInvitationCreatedStateChange を受け取ります。 |
招待を表示できるのはそれを作成したデバイスのみです。 最初以外の招待は、そのデバイスで作成された場合にのみ PartyNetwork::GetInvitations() によって返され、それの PartyInvitationCreatedStateChange は作成デバイスでのみ生成されます。 |
取り消し可能性 | すべてのユーザーが最初の招待を取り消すことができます。 招待構成を明示的に指定する場合は、取り消し可能性を PartyInvitationRevocability::Anyone に設定する必要があります。 |
招待を取り消すことができるのは作成者のみです。 招待を作成するときは、取り消し可能性を PartyInvitationRevocability::Creator に設定する必要があります。 |
有効期間 | 最初の招待は、明示的に取り消されるまで有効です。 | 最初以外の招待は、明示的に取り消されるまで、またはそれを作成したユーザーがネットワークから削除されるまで有効です。 ユーザーがネットワークから削除されると、作成したすべての招待が自動的に取り消されます。 |
作成者 | 最初の招待には作成者がいません。
PartyInvitation::GetCreatorEntityId() は null を返します。 |
PartyNetwork::CreateInvitation を呼び出すときに指定されたユーザーが作成者です。
PartyInvitation::GetCreatorEntityId() はそのユーザーのエンティティ ID を返します。 |
(最初の招待以外の) 招待は、プライバシー上の理由で他のデバイスから非表示になります。 これがなぜ重要なのか、その例として「friends list usage pattern (フレンド リストの使用パターン)」を参照してください。
ユーザーとオープンな招待
招待には、title_player_account
エンティティ ID として指定された 0 人以上のユーザーが含まれています。 招待にユーザーが含まれている場合、招待はそのユーザーにのみネットワークに参加するためのアクセスを許可します。 ただし、招待にユーザーが含まれていない場合、それはオープンな招待です。 すべてのユーザーは、オープンな招待の識別子を使用してネットワークに参加できます。
注意
ゲーム機本体などのマルチユーザー デバイスでは、正しいユーザーに適切な招待を使用してください。 各招待状で指定されたユーザーによっては、PartyNetwork::AuthenticateLocalUser() を介してネットワークに参加するユーザーを認証する際に、デバイス上の異なるユーザーが異なる招待状を使用する必要がある可能性があります。
不変性
招待が作成されると、その構成を変更することはできません。 ただし、招待が取り消された後は、別の構成を使用して同じ識別子の別の招待を作成できます。 「動的な 1 つの招待使用パターン」を参照してください。
使用パターン
PlayFab パーティーの招待は単純ですが、柔軟です。 それらを使用してネットワークに対して異なるアクセス モデルを実現する、多くの効果的な方法があります。
オープンなネットワーク
オープンなネットワークは、理解して実装するのが最も簡単です。 これにより、ネットワーク記述子と招待識別子を持つすべてのユーザーが参加できます。
PartyManager::CreateNewNetwork()
を呼び出すときに、initialInvitationConfiguration
パラメーターに null を渡して、オープンなネットワークを作成します。 オープンな招待の識別子は、out パラメーターとして返されます。 ネットワークの作成が完了したら、ネットワーク記述子と招待識別子を共有して、ユーザーが参加できるようにします。
また、最初の招待状を取り消すことで、将来的にいつでもネットワークを閉鎖することができます。
Warning
ネットワークの安全性は、そのネットワークに参加するデバイスやユーザーの安全性に依存するため、オープンなネットワークのネットワーク記述子と招待識別子を共有するときは注意が必要です。
静的ユーザー リスト
バックフィルのないマッチメイキングによって作成されたゲームなど、事前にすべてのプレイヤーがわかっているゲームでは、静的なユーザー リストが簡単で効果的なパターンとなります。 これにより、ゲームがネットワークへの参加を開始する前に特定されたユーザーのみが許可されます。
PartyInvitationConfiguration
構造体を作成し、既知のユーザーをその entityIds
フィールドに追加します。 この構造体を PartyManager::CreateNewNetwork()
に渡します。 ネットワークの作成が完了したら、ネットワーク記述子と招待識別子を共有して、ユーザーが参加できるようにします。
1 対 1 の招待
既存のユーザーが他のユーザーを個別に招待されるゲームでは、1 対 1 の招待パターンが効果的かつシンプルです。
PartyInvitationConfiguration
構造体を作成し、作成者のみをその entityIds
フィールドに追加します。 この構造体を PartyManager::CreateNewNetwork()
に渡します。 作成者がネットワークに接続すると、最初の招待状を任意に取り消すことができます。 または、ネットワークの作成者は、オープンなネットワークを作成し、接続後すぐに初期招待を取り消すことができます。
ネットワークに参加するユーザーごとに、別の PartyInvitationConfiguration
構造体を作成します。 これらの構造体を PartyNetwork::CreateInvitation()
に渡して招待を作成します。 ネットワーク記述子を各ユーザーと共有し、そのユーザーに対する特定の招待のための招待識別子も共有します。 ユーザーが参加すると、このパターンを繰り返して、より多くのユーザーを招待できます。
ユーザーが参加すると、そのユーザーの特定の招待を任意に取り消すことができます。
フレンド リスト
1 対 1 の招待を作成せずに、各ユーザーの友達を簡単に参加させたいゲームでは、ユーザーの全友達リストを含む招待状を作ることができます。
ネットワークに接続した後、各ユーザーは PartyInvitationConfiguration
構造体を作成し、それぞれのソーシャル プラットフォームの友達をその entityIds
フィールドに追加します。 この構造体を PartyNetwork::CreateInvitation()
に渡し、ネットワーク記述子と招待識別子を友達と共有します。 ユーザーのフレンド リストが変更されると、招待を取り消し、新しいフレンド リストで新しい招待を作成する必要があります。
動的な 1 回の招待
多くのゲームにはロビーまたはその他の外部サービスがあり、特定のネットワークに参加できるユーザーを制御します。 ネットワークを外部サービスと同期させるために、動的な 1 つの招待パターンを使用できます。 このパターンでは、既知の識別子を持つ 1 つの招待が使用されます。
このパターンには 2 つのバリエーションがあります。 外部サービスは、1 人のユーザーを選択してネットワークの招待を管理することも、すべてのユーザーに招待の管理を依頼することもできます。 どちらの場合も、ネットワーク内に存在すべきユーザーのセットが変更されるたびに、外部サービスがユーザーに通知し、ユーザーは現在の招待を取り消して新しい完全なユーザー セットを含む同じ既知の識別子を持つ新しい招待を作成しようとします。
単一のユーザー管理
現在の招待状の取り消しと新しい招待状の作成に権限を持つユーザーが 1 人いれば、招待状の所有権を予測可能になります。 ただし、外部サービスでは次の操作を行う必要があります。
- 招待を管理するユーザーを選択します。
- 前のユーザーがネットワークを退出したときに新しいユーザーを選択します。
すべてのユーザー管理
すべてのユーザーが招待状を管理しようとすると、招待状の所有権が予測できなくなりますが、外部サービスが単一のユーザーを選択する必要がなくなります。 代わりに、各デバイスのユーザーが次の操作を行います。
- 現在の招待を取り消しを試みます。 最初の招待では、すべてのユーザーがこれを試みますが、成功するのは 1 人だけです。 他の招待の場合、最後の招待を作成したユーザーのみが、その招待を取り消すことができます。これは、招待が他のユーザーには表示されないためです。
- 新しい招待の作成を試みます。 招待には一意の識別子が必要であるため、成功するのは 1 人のユーザーだけです。 招待は他のデバイスでは表示されないため、そのユーザーは新しい招待所有者であることを他のユーザーに通知する必要があります。
- 現在の招待の作成者が作成デバイスを離れると、すべてのユーザーが新しい招待の作成を再試行する必要があります。
重要
招待を取り消し、同じ識別子を持つ新しい招待を作成する場合、招待状の識別子が無効になる時間が少しだけ発生します。 この方法を使用して、妥当な待機期間が経過した後に失敗した場合は、PartyNetwork::AuthenticateLocalUser()
の呼び出しを再試行する必要があります。
オープンな招待のローリング
ロビーやその他の外部サービスが特定のネットワークに参加すべきゲームの場合、動的な単独の招待パターンの代わりに、オープンな招待のローリング パターンがあります。 このパターンでは、常に 1 つのオープンな招待があります。 招待は、以前に参加を許可されていたユーザーが外部サービスのユーザー リストから削除されるたびに失効し、新しい識別子で再作成されます。 招待の識別子はパスワードのようなもので、同じように保護する必要があります。 パターンは、次の手順で実装できます。
- 外部サービスは、ネットワークを作成するデバイスを選択し、使用する招待識別子を指定します。
- 外部サービスは、ネットワークに参加すべき他のすべてのユーザーに招待識別子を送信します。
- 新しいユーザーがネットワークに参加する必要がある場合、外部サービスはそのユーザーと現在の招待識別子を共有します。
- 現在の招待を持っているユーザーが参加を許可されなくなった場合、外部サービスは次の手順を実行して「パスワードを変更する」必要があります。
- 新しい招待識別子を選択します。
- 1 人またはすべてのユーザーに現在の招待の取り消しを要求し、選択した招待識別子を持つ新しい招待を作成します。 単一のユーザー管理とすべてのユーザー管理の詳細については、「動的な単一の招待」を参照してください。
- ネットワークへの参加を許可する必要があるすべてのユーザーと新しい招待識別子を共有します。