MPSD S2S 認証
XBOX services の Multiplayer サービスに対する S2S 呼び出しの認証は、他の XBOX services とは異なります。Delegation トークンを使用した呼び出しはサポートされておらず、サービス認証を使用した呼び出しのみが機能します。この認証方式によって、MPSD S2S の追加機能を利用できます。
他の S2S 呼び出しと同様に、Business Partner Certificate が必要です。フル アクセスの Multiplayer.Manage ポリシーが必要です。これは、Business Partner Certificate が作成された Web サービスが S2S 呼び出しに対して正しいアクセス レベルを提供できるようにするために必要です。
サービス認証には次の認証フローが使用されます。
-
Business Partner Certificate を使用して XBOX Authorization Service for Services を呼び出し、
Sトークンを取得します。 -
この
SトークンとSandboxIdを使用して XBOX Secure Token Service (XSTS) を呼び出し、Xトークンを取得します。このステップでDelegationトークンやUserトークンを使用してはなりません。このフローで指定するSandboxIdは、Business Partner Certificate の作成時に指定したサンドボックスのセットに含まれている必要があります。特定のサンドボックスなしで作成された Business Partner Certificate はサポートされておらず、サンドボックスが不足していることを示す認証エラーの原因となります。 -
Xトークンとヘッダー (次のセクションで指定) を使用して MPSD サービスを呼び出します。
MPSD S2S ヘッダー
タイトル ヘッダー
正しいタイトルとして動作するために、X-Xbl-OnBehalfOf-Title ヘッダーが以下の形式で必要です。
例
ユーザー ヘッダー
特定のユーザーまたはユーザーのセットとして動作するために、X-Xbl-OnBehalfOf-Users ヘッダーが以下の形式で必要です。
例
priv=multiplayer のみです。これはユーザーがマルチプレイヤー特権を持っていることを示します。
X-Xbl-OnBehalfOf-Users ヘッダーを使用する場合、ヘッダーで識別されるユーザーが自分のコンソールから直接呼び出しを行っているかのように扱われます。そのため、呼び出し元サービスはユーザーのセキュリティを維持する責任があります。
- 実際の XUID のみを使用できます。
- ユーザーに対して宣言する特権は正しくなければなりません。
- ユーザーは、自分に代わって実行される任意のアクションに同意している必要があります。
Deny-Scope ヘッダー
Multiplayer.Manage アクセス ポリシーは、MPSD サービスへの S2S 呼び出しに対して、ユーザーのアクセス権限を上書きします。そのため、セッションへのアクセスはユーザーの権限に基づいて制限されません。ユーザーの権限チェックを再度有効にするには、次のように X-Xbl-Deny-Scope ヘッダーを使用できます。
例
Multiplayer.Manage アクセス ポリシーが上書きとして使用されないようにします。これは、ユーザーがセッションに対する正しいアクセス権を持っており、可視性や参加制限のためのブロックがサーバー アクセスによって上書きされていないことを確認するために使用できます。
このヘッダーを設定する場合は、フォールバックとして Web サービスに
Multiplayer.Runtime アクセスを付与する必要もあります。これにより、ユーザーの権限が拒否された場合でもアクセスが可能になります。それ以外の場合、エラー シナリオでサービス アクセスは付与されず、403 ステータスが返されます。Multiplayer.Runtime アクセスにはアクティングユーザーが必要です。X-Xbl-Deny-Scope ヘッダーは、X-Xbl-OnBehalfOf-Users または DelegationToken クレームから取得したユーザー クレームと組み合わせた場合にのみ機能します。セッション メンバー管理
複数ユーザーを 1 回の呼び出しで扱うことで、S2S 呼び出しのセッション メンバー管理を最適化できます。 ユーザー ヘッダーを指定する場合、セッション ドキュメント本文内の標準的な “me” メンバーは使用できません。代わりに次のオプションが利用できます。セッション メンバーの追加
前述のパターンのいずれかを使用して、セッション メンバーを追加または変更できます。一般に、プレイヤーを追加する最小の操作はプロパティまたは定数、通常はメンバーのアクティブ ステータス プロパティを設定することです。アクティブに設定されていないメンバーは、MPSD セッションの
InactiveTimeout 値に依存するサービスによって自動的に削除されます。例
セッション メンバーの削除
メンバー セクションをnull に設定することで、セッション メンバーを削除できます。
例
メンバー予約
一般に、すべてのセッション管理がタイトル サービスによって行われる場合は、セッション メンバーの予約は不要です。このシナリオでは、予約を必要とせずにセッション メンバーを直接追加または削除できます。セッション メンバーの予約は、作成されたセッションがクライアントによっても管理される場合にのみ使用してください。on-behalf-of-user ヘッダーで指定したユーザーの順序で、複数ユーザーに対するセッション予約を追加できます。次のパターンは新しいセッションを作成する場合にのみ有効です。
例
大規模セッションでは予約はサポートされていません。予約と、セッション メンバーの追加または削除を混在させることはサポートされていません。
セッション メンバーの状態
タイトル サービスは、system プロパティを通じてセッション メンバーの状態を追跡・設定できます。これにより、メンバーの状態と情報を完全に制御できます。メンバーのアクティブ ステータス
メンバーのアクティブ ステータスは、プレイヤーをセッション内でアクティブとしてマークします。これにより、inactiveRemovalTimeout セッション構成で定義されたシステムによる削除を防ぎます。
active に設定してください。非アクティブなメンバーは、切断されてもセッション メンバーを一時的にセッションに残しておくべきフローでのみ使用してください。S2S フローでは、これもタイトル サーバーで直接管理できます。
メンバーの予約ステータス
reserved member プロパティを通じて、セッション メンバーの予約ステータスを判断できます。このプロパティが true に設定されている場合、そのセッション メンバーは予約された状態であり、まだセッション内でアクティブではありません。
以下はセッション ドキュメントの例です。
reservedRemovalTimeout の期限切れ後に MPSD によってセッションから削除されます。
大規模セッションの制限事項
Large 機能を有効にした MPSD セッションは、100 人を超えるプレイヤーをサポートします。これらのセッションは通常のセッションとは異なる動作をします。詳細は、マルチプレイヤーで大規模セッションを有効化する を参照してください。 大規模セッションへの操作は常に単一ユーザーとして実行されます。そのため、大規模セッションへの S2S 呼び出しでは、X-Xbl-OnBehalfOf-Users ヘッダーに単一のユーザーのみを含める必要があります。複数ユーザー操作はサポートされていません。各ユーザーに対して個別に呼び出しを行って、ユーザーの追加または削除を行う必要があります。基となるセッション ドキュメントでのロック競合を回避するために、これらの S2S 呼び出しは順次実行してください。同じドキュメントに対する並列操作は呼び出し時間を長くし、全体の操作時間を短縮しません。
S2S 呼び出しの結果は、大規模セッションの完全なメンバー リストへのアクセスを提供しません。呼び出しで指定されたユーザーのメンバー データのみが返されます。
そのため、タイトル サービスは大規模セッションのメンバー ユーザー情報を独自のロジックで追跡し、MPSD のメンバー情報を使用して XBOX Requirements (XR) を正しくサポートする必要があります。
Encounters と Groups
Large 機能を持つセッションでは、最近のプレイヤー リストは自動的には更新されません。代わりに、他のプレイヤーは Encounters と Groups を通じて最近のプレイヤー リストに直接追加されます。詳細は、マルチプレイヤーで大規模セッションを有効化する を参照してください。 セッション メンバーを encounter の一部としてフラグ付けするには、次のパターンを使用します。例
encounter を正しくキャプチャするには、
encounters プロパティをすべての参加セッション メンバーに 30 秒以内に書き込む必要があります。encounter のセットは point-in-time プロパティです。ただちに消費され、応答には表示されません。例
groups プロパティ リストからそのグループを削除します。空のリストで書き込み操作を行うと、すべてのグループ メンバーシップが削除されます。
groups プロパティは永続的で、メンバーの応答に表示されます。アクティビティ セッション管理
ユーザーの MPSD アクティビティ ハンドルは、プラットフォームでの招待や参加中への参加 (join-in-progress) にどのセッションが使用されるかを決定します。このハンドルは S2S 呼び出しからは設定できず、クライアント API 経由でのみ利用できます。タイトル サーバーはクライアントとセッション名を共有することで、S2S セッションに対するアクティビティ ハンドルの作成を可能にできます。 ハンドルに関する詳細は、次を参照してください。- マルチプレイヤーの概念の概要トピック内の セッション ハンドル セクション
- Multiplayer Session Directory の概要トピック内の MPSD ハンドルからセッションへ セクション
ベスト プラクティス
MPSD S2S 呼び出しを行う際は、問題を回避しパフォーマンスを向上させるために、次のベスト プラクティスに従ってください。- 複数ユーザーの操作をまとめる 可能な限り、MPSD への S2S 呼び出しは複数ユーザーに対するバッチ操作として実行してください。これによりパフォーマンスが向上し、ネットワーク トラフィックが削減されます。呼び出しを削減する効率的なアプローチは、MPSD 操作をタイトル サーバーでキューに入れ、5 秒間隔ですべての要求をマージすることです。これにより、効率性とレイテンシのバランスが取れます。
- 複数のセッションおよびメンバー操作をマージする タイトルは、可能な限りユーザー操作をマージしてください。セッション メンバーの追加は、同時に関連するすべてのメンバー プロパティの設定と組み合わせて行う必要があります。
- 同じドキュメントへの S2S 呼び出しは順次実行する 同じ MPSD ドキュメントへのすべての呼び出しは、常に順次実行してください。並列に操作を行うと、基となる MPSD ドキュメントのロック競合を引き起こし、パフォーマンスの低下や要求の失敗につながる可能性があります。
- クライアントでハンドル アクティビティ操作に応答する MPSD アクティビティ ハンドルはクライアント API 経由でのみサポートされます。タイトル サービスは、セッション名を共有し関連するクライアント API を使用することで、クライアントにこれらのハンドルを作成させる必要があります。
- クライアント セッション サブスクリプションと接続は不要 完全に S2S 呼び出し経由で管理されるすべての MPSD セッションでは、接続機能は不要です。S2S 呼び出しフローでは、クライアントとの WebSocket 接続は不要です。代わりに、タイトル サービスがセッション メンバーの追加または削除を直接完全に処理する必要があります。
-
大規模セッションの操作
大規模セッションの S2S ロジックは、複数メンバーによる操作が利用できないため、小規模セッションとは異なる方法で処理する必要があります。タイトル サービスは、メンバーの追加または削除を含む同じセッション ドキュメントへのすべての操作を順次実行する必要があります。多数のメンバーの場合、メンバー操作に遅延が発生することがあります。このような遅延は許容範囲内であり、プラットフォームの要件に違反するものではありません。
大規模セッションのメンバー ロジックを簡素化するために、タイトルは MPSD セッションを使用してプレイヤーのメンバーシップのみを追跡し、他のすべてのプレイヤー データを内部的に処理できます。
タイトル サーバー用の大規模 MPSD セッションは、プレイヤーがいなくてもサーバー起動時に作成するのが最も簡単です。これには、次の例に示すように、MPSD セッション定数で
sessionEmptyTimeoutを構成する必要があります。 - 大規模セッションでの join-in-progress や招待 大規模セッションは、XBOX services を通じて join-in-progress と招待をサポートします。ほとんどのシナリオでは、この機能をサポートするために通常のセッションを使用する方が簡単です。このセッションはタイトル サーバーまたはクライアントによって制御でき、関連する大規模セッションに参加するための情報を含める必要があります。
-
大規模セッションでの encounters
大規模セッションでの encounters が正しくキャプチャされるようにするには、すべての
encountersメンバー プロパティを 30 秒以内に書き込む必要があります。タイトル サービスは、すべての参加メンバーのencountersプロパティに対する更新を、常に単一のサービス呼び出しにバッチ処理するようにしてください。encounter は一意の識別子を使用する必要があります。GUID の使用をお勧めします。
