PlayFab Party 邀请和安全模型

默认情况下,PlayFab Party 旨在提供安全的通信环境。 这有助于保护游戏和玩家,但安全限制可能会给开发人员带来 API 使用问题。 本页介绍 PlayFab Party 的安全功能,主要侧重于邀请和使用它们的有效模式。

PlayFab Party 对所有通信(管理数据、游戏数据和实时通信)使用行业标准进行加密和身份验证。 这包括到 Azure 服务的所有对等传输和所有事务,无论是 Web 服务(使用 HTTPS)还是透明云中继服务(使用 DTLS)。

限制对网络的访问是保护网络完整性的核心部分。 加入网络的能力取决于四项内容:

请注意,给定的 PlayFab Party 网络最多可以有 32 个玩家。

邀请

邀请 (PartyInvitation) 是网络中授予用户访问网络权限的对象。 在网络的整个生命周期中,可以创建撤销邀请。 邀请拥有创建者、唯一的标识符可撤销性设置以及指定为实体 ID 的可选用户集。 网络可以具有任意数量的活动邀请,包括无。 网络始终通过初始邀请创建。

邀请生存期

邀请从创建之时起一直有效,直到被撤销。

创建

可以通过以下两种方式创建邀请。 第一种方法是调用 PartyManager::CreateNewNetwork()。 加入网络需要邀请,因此在创建网络时必须存在邀请。 此邀请称为初始邀请,具有一些 如下所述的特殊属性。 第二种方法是调用 PartyNetwork::CreateInvitation()

邀请的创建者是调用 PartyNetwork::CreateInvitation()时指定的用户。 初始邀请没有创建者。

创建邀请时(或使用活动初始邀请加入网络时),将生成 PartyInvitationCreatedStateChange

重要

初始邀请并不隐含地允许网络创建者加入。 除非使用 公开邀请 ,否则请务必在用户列表中包含创建者的实体 ID。

枚举

枚举活动邀请使用 PartyNetwork::GetInvitations()完成。 只能枚举在本地设备上创建的邀请,以及初始邀请(如果仍处于活动状态)。

吊销

通过调用 PartyNetwork::RevokeInvitation() 可撤销邀请。 只有邀请的创建者可以撤消邀请,但初始邀请除外,任何用户都可能会撤消该邀请。 此外,当从网络中删除创建邀请的用户时,将自动撤销邀请。

撤消邀请后,会在可以看到邀请的所有设备上生成 PartyInvitationRevokedStateChange

撤销初始邀请后,无法再次创建。 其标识符可能会重复用于新邀请,但该新邀请将不具有初始邀请的特殊属性。

重要

撤消邀请对已加入网络的设备和用户没有影响。 如果要从网络中删除用户或设备,请使用 PartyNetwork::KickUser()PartyNetwork::KickDevice()。 请注意,这些方法尚未实现。

邀请配置

邀请的配置是在创建期间使用 PartyInvitationConfiguration 结构指定。

标识符

每个邀请都有一个标识符,可以在网络中唯一地标识它。 如果在创建邀请时未指定标识符,则 Party 将分配一个标识符。 对于调用 PartyManager::CreateNewNetwork(),分配的标识符在 out 参数中返回,并在网络创建完成时在 PartyCreateNewNetworkCompletedStateChange 中报告。 对于调用 PartyManager::CreateInvitation(),可在邀请创建完成时从 invitation out 参数或 PartyCreateInvitationCompletedStateChange 中的 invitation字段检索分配的标识符。

虽然邀请标识符必须唯一,但在邀请被撤销后,标识符可能会在创建新邀请时重复使用。

初始邀请和其他邀请

尽管只有一种类型的邀请,但通过调用 PartyManager::CreateNewNetwork() 创建的初始邀请与稍后通过 PartyNetwork::CreateInvitation() 创建的邀请略有不同。 下表中汇总了差别之处。

属性 初始邀请 其他邀请
可见性 所有设备都可以看到初始邀请。 只要初始邀请未被撤销,就会通过调用 PartyNetwork::GetInvitations() 返回。 加入网络后,每个设备都将收到初始邀请的 PartyInvitationCreatedStateChange (如果之前尚未撤消)。 只有创建邀请的设备才能看到它。 如果非初始邀请是在该设备上创建的,则仅由 PartyNetwork::GetInvitations() 返回,并且只会在创建设备上为其生成 PartyInvitationCreatedStateChange
可撤销性 任何人都可以撤销初始邀请。 明确指定邀请配置时,可撤销性必须设置为 PartyInvitationRevocability::Anyone 只有创建者可以撤销邀请。 创建邀请时,可撤销性必须设置为 PartyInvitationRevocability::Creator
生存期 初始邀请一直有效,直到被明确撤销。 非初始邀请一直有效,直到它被明确撤销,或者直到从网络中删除创建它的用户。 从网络中删除用户后,将自动撤销他们创建的所有邀请。
创建者 初始邀请没有创建者。 PartyInvitation::GetCreatorEntityId() 将返回 null。 调用 PartyNetwork::CreateInvitation 时指定的用户是创建者。 PartyInvitation::GetCreatorEntityId() 将返回此用户的实体 ID。

出于隐私原因,邀请(初始邀请除外)对其他设备隐藏。 有关重要原因的示例,请参阅好友列表使用模式

用户和公开邀请

邀请包含指定为 title_player_account实体 ID 的 0 个或更多用户。 如果邀请包含用户,则该邀请仅向这些用户授予加入网络的权限。 但是,如果邀请不包含任何用户,则这是一个公开邀请。 任何用户都可使用公开邀请的标识符加入网络。

注意

在多用户设备(例如主机)上,请确保对正确的用户使用正确的邀请。 根据每个邀请中指定的用户,设备上的不同用户在通过 PartyNetwork::AuthenticateLocalUser() 验证用户进入网络时可能需要使用不同的邀请。

不可变性

创建邀请后,无法更改其配置。 但是,撤销邀请后,可以使用相同的标识符但不同的配置创建另一个邀请。 请参阅动态单一邀请使用模式

使用模式

PlayFab 群邀请简单而灵活。 可以使用多种有效的方法来实现网络的不同访问模型。 下面是一些常见的模式。

打开网络

开放网络是最易于理解和实现的网络。 它允许任何拥有网络描述符和邀请标识符的人加入。

通过在调用 PartyManager::CreateNewNetwork() 时为 initialInvitationConfiguration 参数传递 null 来创建开放网络。 公开邀请的标识符作为 out 参数返回。 网络创建完成后,共享网络描述符和邀请标识符以允许用户加入。

或者,可以在将来的任何时候通过撤销初始邀请来关闭网络。

警告

因为网络的安全性取决于加入它的设备和用户,所以在共享开放网络的网络描述符和邀请标识符时要小心。

静态用户列表

对于预先了解所有玩家的游戏,例如通过匹配创建的没有回填的游戏,静态用户列表是一种简单有效的模式。 这仅允许在游戏开始加入网络之前识别的那些用户。

创建 PartyInvitationConfiguration 结构并将已知用户添加到其 entityIds 字段。 将此结构传递到 PartyManager::CreateNewNetwork()。 网络创建完成后,共享网络描述符和邀请标识符以允许用户加入。

一对一邀请

在现有用户单独邀请用户的游戏中,一对一邀请模式既有效又简单。

创建 PartyInvitationConfiguration 结构并仅将创建者添加到其 entityIds 字段。 将此结构传递到 PartyManager::CreateNewNetwork()。 创建者连接到网络后,可以选择撤销初始邀请。 或者,网络创建者可以创建 开放网络 ,然后在连接后立即撤销初始邀请。

为每个应加入网络的用户创建额外的 PartyInvitationConfiguration 结构。 通过将这些结构传递到 PartyNetwork::CreateInvitation() 来创建邀请。 与每个用户共享网络描述符及其特定邀请的邀请标识符。 随着用户加入,他们可能会重复此模式以邀请更多用户。

用户加入后,可以选择撤销其特定邀请。

好友列表

对于希望允许每个用户的好友轻松加入而无需创建一对一邀请的游戏,可以创建包含用户整个好友列表的邀请。

连接到网络后,每个用户将创建一个 PartyInvitationConfiguration 结构,并将每个社交平台好友添加到其 entityIds 字段。 将此结构传递给 PartyNetwork::CreateInvitation(),并与好友共享网络描述符和邀请标识符。 用户的好友列表发生变化时,应撤销邀请并使用新好友列表创建新邀请。

动态单一邀请

许多游戏都有一个大厅或其他外部服务来控制谁应该加入给定的网络。 为了使网络与外部服务保持同步,可以使用动态单一邀请模式。 此模式使用具有已知标识符的单个邀请。

此模式有两个变体。 外部服务可以选择单个用户来管理网络邀请,也可以要求所有用户尝试管理邀请。 在这两种情况下,每当网络中应包含的用户集发生更改时,外部服务都会通知用户,并且用户会尝试撤销当前邀请,并使用包含新完整用户集的同一已知标识符创建新邀请。

单用户管理

让单个用户负责撤销当前邀请并创建新邀请,可以预测性获得邀请的所有权。 但是,外部服务将需要以下内容。

  • 选择将管理邀请的用户。
  • 当前一个用户离开网络时选择一个新用户。

所有用户管理

让所有用户尝试管理邀请会导致不可预测的邀请所有权,但会阻止外部服务需要选择单个用户。 相反,每台设备上的用户将执行以下操作。

  • 尝试撤销当前邀请。 对于初始邀请,所有用户都将尝试此操作,但只有一个会成功。 对于其他邀请,只有创建最后一个邀请的用户才能尝试撤销邀请,因为其他用户将看不到此邀请。
  • 尝试创建新邀请。 由于邀请必须具有唯一标识符,因此只有一个用户会成功。 此用户必须通知其他人它是新的邀请所有者,因为此邀请在其他设备上不可见。
  • 当创建当前邀请的创建者离开创建设备时,所有用户必须再次尝试创建新邀请,如上所示。

重要

撤销邀请并创建具有相同标识符的新邀请时,邀请标识符会在一段时间内无效。 如果使用这种方法,并在合理的等待期后调用 PartyNetwork::AuthenticateLocalUser() 失败时,有必要重试。

滚动公开邀请

对于大厅或其他外部服务控制谁应该加入给定网络的游戏,动态单一邀请模式的替代方案是滚动公开邀请模式。 在这种模式中,总是有一个公开邀请。 当先前允许加入的用户从外部服务的用户列表中删除时,就会撤销并使用新标识符重新创建邀请。 邀请标识符就像密码一样,应该受到类似的保护。 此模式可以通过以下步骤实现:

  • 外部服务选择要创建网络的设备,并指定要使用的邀请标识符。
  • 外部服务将邀请标识符发送给应加入网络的所有其他用户。
  • 新用户应加入网络时,外部服务会与该用户共享当前邀请标识符。
  • 已获得当前邀请的用户不再被允许加入时,外部服务将需要通过执行以下操作来“更改密码”。
    • 选择一个新的邀请标识符。
    • 请求一位或所有用户撤销当前邀请,并使用所选邀请标识符创建新邀请。 有关单用户管理与所有用户管理的讨论,请参阅动态单一邀请
    • 与现在应该被允许加入网络的所有用户共享新的邀请标识符。

后续步骤