MPSD S2S 身份验证
XBOX services 多人游戏服务的 S2S 调用身份验证与其他 XBOX services 不同。不支持使用Delegation 令牌的调用,只有使用服务身份验证的调用才能正常工作。这种身份验证类型可启用额外的 MPSD S2S 功能。
与其他 S2S 调用一样,需要业务合作伙伴证书。必须配置完全访问权限的 Multiplayer.Manage 策略。这是必需的,以便创建业务合作伙伴证书的 Web 服务能够为 S2S 调用提供正确的访问级别。
服务身份验证使用以下身份验证流程。
-
使用业务合作伙伴证书调用 XBOX 服务授权服务,以检索
S令牌。 -
使用此
S令牌和SandboxId调用 XBOX 安全令牌服务 (XSTS),以接收X令牌。此步骤中不得使用Delegation令牌或User令牌。通过此流程指定的SandboxId还必须包含在创建业务合作伙伴证书期间指定的沙盒集合中。不支持没有特定沙盒的业务合作伙伴证书,将导致指示缺少沙盒的身份验证错误。 -
使用
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 声明中获取的用户声明一起使用。会话成员管理
您可以通过在一次调用中处理多个用户来优化 S2S 调用的会话成员管理。 指定用户标头时,无法使用会话文档正文中的标准 “me” 成员。相反,可以使用以下选项。添加会话成员
您可以使用前面提到的模式之一添加或修改会话成员。通常,添加玩家的最低操作是设置一个属性或常量,通常是成员的活动状态属性。未设置为活动状态的成员会由服务自动删除,该服务依赖 MPSD 会话的
InactiveTimeout 值。示例
删除会话成员
您可以通过将成员部分设置为null 来删除会话成员。
示例
成员预留
一般来说,如果所有会话管理都由游戏服务执行,则不需要为会话成员预留席位。在这种情况下,您可以直接添加和删除会话成员,而无需预留。只有当创建的会话之后还由客户端管理时,才应使用会话成员的预留。 您可以按on-behalf-of-user 标头中指定的用户顺序,为会话中的多个用户添加预留。以下模式仅在创建新会话时有效。
示例
大型会话不支持预留。不支持混合使用预留与添加或删除会话成员。
会话成员状态
游戏服务可以通过系统属性跟踪和设置会话成员的状态。这允许完全控制成员状态和信息。成员活动状态
成员的活动状态是将玩家在会话中标记为活动状态。这可防止系统按照inactiveRemovalTimeout 会话配置中的定义删除该成员,如下所示。
active。仅在会话成员应临时留在会话中的流程中使用非活动成员,即使他们已断开连接。对于 S2S 流程,这也可以直接在游戏服务器中管理。
成员预留状态
您可以通过reserved member 属性确定会话成员的预留状态。如果此属性设置为 true,则该会话成员处于预留状态,尚未在会话中激活。
以下是一个会话文档示例。
reservedRemovalTimeout 到期后,这些成员会由 MPSD 从会话中删除。
大型会话限制
启用大型功能的 MPSD 会话支持超过 100 名玩家。这些会话的功能与常规会话不同。有关详细信息,请参阅 为多人游戏启用大型会话。 对大型会话的操作始终作为单个用户执行。因此,对大型会话的 S2S 调用必须在X-Xbl-OnBehalfOf-Users 标头中仅包含单个用户。不支持多用户操作。您必须为每个用户通过单独的调用添加或删除用户。按顺序执行这些 S2S 调用,以避免底层会话文档的锁定拥塞。对同一文档的并行操作会导致更长的调用时间,并不会加快总操作时间。
S2S 调用结果也无法访问大型会话的完整成员列表。仅返回调用中指定的用户的成员数据。
因此,游戏服务应在自己的逻辑中跟踪大型会话成员的用户信息,并使用 MPSD 成员资格来正确支持 XBOX 要求 (XR)。
遭遇和分组
启用大型功能的会话不会自动更新最近玩家列表。相反,其他玩家通过遭遇和分组直接添加到最近玩家列表中。有关更多详细信息,请参阅 为多人游戏启用大型会话。 使用以下模式将会话成员标记为遭遇的一部分。示例
为了正确捕获遭遇,必须在 30 秒内将
encounters 属性写入所有参与的会话成员。遭遇集合是一个即时属性。它会立即被消费,并且在响应中不可见。示例
groups 属性列表中删除该分组。带有空列表的写入操作会删除所有分组成员资格。
groups 属性是持久的,并在成员的响应中可见。活动会话管理
用户的 MPSD 活动句柄决定了哪个会话用于平台邀请和加入正在进行的游戏。此句柄无法通过 S2S 调用设置,仅通过客户端 API 提供。游戏服务器可以与客户端共享会话名称,以便为 S2S 会话启用活动句柄创建。 有关句柄的更多信息,请参阅以下内容: 要直接控制玩家活动,请参阅 多人游戏活动服务 (MPA)。请注意,MPA 和 MPSD 不能同时使用。最佳实践
执行 MPSD S2S 调用时,游戏应遵循以下最佳实践以避免问题并提高性能。- 合并多个用户的操作 只要有可能,对 MPSD 的 S2S 调用应作为多个用户的批量操作执行。这可以提高性能并减少网络流量。减少调用的一种有效方法是在游戏服务器上排队 MPSD 操作,并以五秒为间隔合并所有请求。这在效率和延迟之间提供了平衡。
- 合并多个会话和成员操作 游戏应确保尽可能合并用户操作。添加会话成员时应始终同时设置所有相关的成员属性。
- 对同一文档按顺序执行 S2S 调用 对同一 MPSD 文档的所有调用都应按顺序执行。执行并行操作可能会导致底层 MPSD 文档的锁定拥塞,并导致性能下降和请求失败。
- 在客户端响应句柄活动操作 MPSD 活动句柄仅通过客户端 API 支持。游戏服务必须使用客户端通过共享会话名称并使用相关的客户端 API 来创建这些句柄。
- 不需要客户端会话订阅和连接 对于所有完全通过 S2S 调用管理的 MPSD 会话,不需要连接功能。对于 S2S 调用流程,不需要与客户端建立 WebSocket 连接。相反,游戏服务应完全处理直接添加或删除会话成员的操作。
-
大型会话操作
大型会话的 S2S 逻辑必须与小型会话不同处理,因为多成员操作不可用。游戏服务应对同一会话文档的所有操作(包括添加或删除成员)按顺序执行。对于大量成员,这可能会导致成员操作延迟。这种延迟是可以接受的,不会违反平台要求。
为了简化大型会话的成员逻辑,游戏可以使用 MPSD 会话仅跟踪玩家成员资格,并在内部处理所有其他玩家数据。
最简单的方法是在服务器启动时为游戏服务器创建大型 MPSD 会话,即使其中没有任何玩家。这需要在 MPSD 会话常量中配置
sessionEmptyTimeout,如以下示例所示。 - 大型会话加入正在进行的游戏或邀请 大型会话通过 XBOX services 支持加入正在进行的游戏和邀请。对于大多数场景,使用常规会话来支持此功能更简单。此会话可由游戏服务器或客户端控制,应包含加入相关大型会话的信息。
-
大型会话遭遇
为确保正确捕获大型会话中的遭遇,所有
encounters成员属性都应在 30 秒内写入。游戏服务应始终尝试将所有参与成员的encounters属性更新批量合并到单次服务调用中。遭遇必须使用唯一标识符。我们建议使用 GUID。
