> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PlayFab Party 邀請與安全性模型

> PlayFab Party 邀請如何授權玩家加入網路，以及安全性模型如何管控聊天和資料存取的概念概觀。

PlayFab Party 的設計預設會提供安全的通訊環境。這有助於保護遊戲和玩家，但安全性限制可能會讓開發人員對 API 的使用方式產生疑問。本頁介紹 PlayFab Party 的安全性功能，主要著重於邀請及其有效的使用模式。

PlayFab Party 對所有通訊 (管理資料、遊戲資料和即時通訊) 使用業界標準的加密和驗證。這包括所有對等傳輸，以及所有對 Azure 服務的交易，無論是 Web 服務 (使用 HTTPS) 還是透明的雲端轉送服務 (使用 DTLS)。

限制對網路的存取是保護網路完整性的核心部分。加入網路需要四項條件：

* 知道[網路描述元](/zh-TW/services/playfab/multiplayer/networking/concepts-objects#network)
* 擁有有效的 PlayFab `title_player_account` [實體權杖](/zh-TW/services/playfab/live-service-management/game-configuration/entities)
* 知道邀請[識別碼](#identifiers)
* 權杖的 PlayFab [實體識別碼](/zh-TW/services/playfab/live-service-management/game-configuration/entities)存在於指定的邀請中，或指定的邀請是[開放邀請](#users-and-open-invitations)

一個 PlayFab Party 網路最多可以有 [128 位玩家](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/request-party-service#partynetworkconfiguration)。

## 邀請

邀請 (`PartyInvitation`) 是網路中授與使用者網路存取權的物件。在網路的整個存留期間，都可以[建立](#creation)和[撤銷](#revocation)邀請。邀請具有[建立者](#creation)、唯一的[識別碼](#identifiers)、[可撤銷性設定](#initial-invitation-and-other-invitations)，以及以實體識別碼指定的選用[使用者集合](#users-and-open-invitations)。網路可以有任意數目的作用中邀請，包括沒有邀請。建立網路時一律會附帶初始邀請。

## 邀請存留期

邀請從建立時開始作用，直到被撤銷為止。

<a id="creation" />

### 建立

有兩種方式可以建立邀請。第一種方式是呼叫 `PartyManager::CreateNewNetwork()`。由於加入網路需要邀請，因此建立網路時必須有一個邀請存在。此邀請稱為初始邀請，具有一些[下方所述](#initial-invitation-and-other-invitations)的特殊屬性。第二種方式是呼叫 `PartyNetwork::CreateInvitation()`。

邀請的建立者是呼叫 `PartyNetwork::CreateInvitation()` 時指定的使用者。初始邀請沒有建立者。

建立邀請時 (或加入具有作用中初始邀請的網路時)，會產生 `PartyInvitationCreatedStateChange`。

<Info>
  初始邀請並不會隱含地允許網路的建立者加入。除非使用的是[開放邀請](#users-and-open-invitations)，否則請務必在使用者清單中包含建立者的實體識別碼。
</Info>

### 列舉

使用 `PartyNetwork::GetInvitations()` 列舉作用中的邀請。只能列舉在本機裝置上建立的邀請，以及仍在作用中的初始邀請。

<a id="revocation" />

### 撤銷

呼叫 `PartyNetwork::RevokeInvitation()` 即可撤銷邀請。只有邀請的建立者可以撤銷邀請，但初始邀請例外，任何使用者都可以撤銷。此外，當建立邀請的使用者從網路中移除時，該邀請會自動撤銷。

撤銷邀請時，所有能看見該邀請的裝置上都會產生 `PartyInvitationRevokedStateChange`。

初始邀請一旦撤銷，就無法再次建立。其識別碼可以重複用於新的邀請，但新的邀請不會具有初始邀請的特殊屬性。

<Info>
  撤銷邀請不會影響已加入網路的裝置和使用者。若要從網路中移除使用者或裝置，請使用 `PartyNetwork::KickUser()` 或 `PartyNetwork::KickDevice()`。請注意，這些方法尚未實作。
</Info>

## 邀請設定

邀請的設定是在建立期間使用 `PartyInvitationConfiguration` 結構指定。

<a id="identifiers" />

### 識別碼

每個邀請都有一個在網路中唯一識別它的識別碼。如果建立邀請時未指定識別碼，Party 會指派一個識別碼。對於 `PartyManager::CreateNewNetwork()` 的呼叫，指派的識別碼會在輸出參數中傳回，並且也會在網路建立完成時於 `PartyCreateNewNetworkCompletedStateChange` 中回報。對於 `PartyManager::CreateInvitation()` 的呼叫，指派的識別碼可以從 `invitation` 輸出參數擷取，或在邀請建立完成時從 `PartyCreateInvitationCompletedStateChange` 中的 `invitation` 欄位擷取。

雖然邀請識別碼必須是唯一的，但在撤銷邀請之後，建立新的邀請時可以重複使用其識別碼。

<a id="initial-invitation-and-other-invitations" />

### 初始邀請和其他邀請

雖然只有一種邀請類型，但呼叫 `PartyManager::CreateNewNetwork()` 所建立的初始邀請，與之後透過 `PartyNetwork::CreateInvitation()` 建立的邀請稍有不同。下表摘要說明這些差異。

| 屬性 | 初始邀請 | 其他邀請 |
| - | - | - |
| 可見性 | 所有裝置都能看見初始邀請。只要初始邀請尚未撤銷，`PartyNetwork::GetInvitations()` 的呼叫就會傳回初始邀請。加入網路時，如果初始邀請先前未被撤銷，每個裝置都會收到初始邀請的 `PartyInvitationCreatedStateChange`。 | 只有建立邀請的裝置能看見該邀請。只有在非初始邀請是在該裝置上建立時，`PartyNetwork::GetInvitations()` 才會傳回該邀請，且只會在建立邀請的裝置上為其產生 `PartyInvitationCreatedStateChange`。 |
| 可撤銷性 | 任何人都可以撤銷初始邀請。明確指定邀請設定時，可撤銷性必須設為 `PartyInvitationRevocability::Anyone`。 | 只有建立者可以撤銷邀請。建立邀請時，可撤銷性必須設為 `PartyInvitationRevocability::Creator`。 |
| 存留期 | 初始邀請在明確撤銷之前都會保持作用中。 | 非初始邀請在明確撤銷之前，或在建立它的使用者從網路中移除之前，都會保持作用中。當使用者從網路中移除時，其建立的所有邀請都會自動撤銷。 |
| 建立者 | 初始邀請沒有建立者。`PartyInvitation::GetCreatorEntityId()` 會傳回 null。 | 呼叫 `PartyNetwork::CreateInvitation` 時指定的使用者即為建立者。`PartyInvitation::GetCreatorEntityId()` 會傳回該使用者的實體識別碼。 |

基於隱私權考量，邀請 (初始邀請除外) 不會對其他裝置顯示。如需說明這一點為何重要的範例，請參閱[好友清單使用模式](#friends-list)。

<a id="users-and-open-invitations" />

### 使用者和開放邀請

邀請包含 0 位或更多以 `title_player_account` [實體識別碼](/zh-TW/services/playfab/live-service-management/game-configuration/entities)指定的使用者。如果邀請包含使用者，該邀請只會授與這些使用者加入網路的存取權。不過，如果邀請不包含任何使用者，它就是開放邀請。任何使用者都可以使用開放邀請的識別碼加入網路。

<Note>
  在多使用者裝置 (例如遊戲主機) 上，請務必對正確的使用者使用正確的邀請。視每個邀請中指定的使用者而定，透過 PartyNetwork::AuthenticateLocalUser() 將使用者驗證到網路時，裝置上的不同使用者可能需要使用不同的邀請。
</Note>

### 不可變性

邀請建立後，就無法變更其設定。不過，在撤銷邀請之後，可以使用相同的識別碼但不同的設定建立另一個邀請。請參閱[動態單一邀請使用模式](#dynamic-single-invitation)。

## 使用模式

PlayFab Party 邀請簡單而有彈性。有許多有效的方式可以使用邀請，為網路實現不同的存取模型。

<a id="open-network" />

### 開放網路

開放網路最容易理解和實作。它允許任何擁有網路描述元和邀請識別碼的人加入。

呼叫 `PartyManager::CreateNewNetwork()` 時，為 `initialInvitationConfiguration` 參數傳遞 null，即可建立開放網路。開放邀請的識別碼會以輸出參數傳回。網路建立完成後，分享網路描述元和邀請識別碼，讓使用者能夠加入。

您也可以選擇在未來任何時間點撤銷初始邀請，以關閉網路。

<Warning>
  由於網路的安全性取決於加入它的裝置和使用者，因此分享開放網路的網路描述元和邀請識別碼時請務必謹慎。
</Warning>

### 靜態使用者清單

對於事先知道所有玩家的遊戲 (例如由配對建立且沒有回填的遊戲)，靜態使用者清單是簡單而有效的模式。這只允許在遊戲開始前已識別的使用者加入網路。

建立 `PartyInvitationConfiguration` 結構，並將已知的使用者新增至其 `entityIds` 欄位。將此結構傳入 `PartyManager::CreateNewNetwork()`。網路建立完成後，分享網路描述元和邀請識別碼，讓使用者能夠加入。

<a id="one-to-one-invitations" />

### 一對一邀請

在現有使用者個別邀請其他使用者的遊戲中，一對一邀請模式既有效又簡單。

建立 `PartyInvitationConfiguration` 結構，並只將建立者新增至其 `entityIds` 欄位。將此結構傳入 `PartyManager::CreateNewNetwork()`。建立者連線到網路後，可以選擇撤銷初始邀請。或者，網路的建立者可以建立[開放網路](#open-network)，然後在連線後立即撤銷初始邀請。

為每位應加入網路的使用者建立另一個 `PartyInvitationConfiguration` 結構。將這些結構傳入 `PartyNetwork::CreateInvitation()` 以建立邀請。將網路描述元連同各使用者專屬邀請的邀請識別碼分享給每位使用者。使用者加入後，可以重複此模式邀請更多使用者。

使用者加入後，可以選擇撤銷其專屬邀請。

<a id="friends-list" />

### 好友清單

對於想要讓每位使用者的好友輕鬆加入、而不必建立[一對一邀請](#one-to-one-invitations)的遊戲，可以建立包含使用者完整好友清單的邀請。

連線到網路後，每位使用者都會建立 `PartyInvitationConfiguration` 結構，並將其每位社交平台好友新增至其 `entityIds` 欄位。將此結構傳遞給 `PartyNetwork::CreateInvitation()`，並與好友分享網路描述元和邀請識別碼。當使用者的好友清單變更時，應撤銷邀請，並以新的好友清單建立新的邀請。

<a id="dynamic-single-invitation" />

### 動態單一邀請

許多遊戲都有大廳或其他外部服務，控制應由誰加入指定的網路。若要讓網路與外部服務保持同步，可以使用動態單一邀請模式。此模式使用具有已知識別碼的單一邀請。

此模式有兩種變體。外部服務可以選取單一使用者來管理網路的邀請，也可以要求所有使用者嘗試管理邀請。在這兩種情況下，每當應在網路中的使用者集合變更時，外部服務都會通知使用者，而使用者會嘗試撤銷目前的邀請，並以相同的已知識別碼建立包含新的完整使用者集合的新邀請。

#### 單一使用者管理

讓單一使用者負責撤銷目前的邀請並建立新的邀請，可讓邀請的擁有權可預測。不過，外部服務需要執行下列動作。

* 選取將管理邀請的使用者。
* 當前一位使用者離開網路時，選取新的使用者。

#### 所有使用者管理

讓所有使用者嘗試管理邀請，會導致邀請擁有權無法預測，但外部服務就不需要選取單一使用者。相反地，每個裝置上的使用者會執行下列動作。

* 嘗試撤銷目前的邀請。對於初始邀請，所有使用者都會嘗試，但只有一位會成功。對於其他邀請，只有建立最後一個邀請的使用者能嘗試撤銷，因為其他使用者看不到該邀請。
* 嘗試建立新的邀請。由於邀請必須具有唯一的識別碼，因此只有一位使用者會成功。該使用者必須通知其他人自己是新的邀請擁有者，因為其他裝置上看不到該邀請。
* 當目前邀請的建立者離開建立邀請的裝置時，所有使用者都必須再次嘗試建立新的邀請。

<Info>
  撤銷邀請並以相同識別碼建立新邀請時，會有一小段時間邀請識別碼無效。如果您使用此方法，當 `PartyNetwork::AuthenticateLocalUser()` 的呼叫失敗時，必須在合理的等候時間後重試。
</Info>

### 輪替開放邀請

對於由大廳或其他外部服務控制應由誰加入指定網路的遊戲，[動態單一邀請](#dynamic-single-invitation)模式的替代方案是輪替開放邀請模式。在此模式中，一律只有一個開放邀請。每當先前允許加入的使用者從外部服務的使用者清單中移除時，就會撤銷邀請，並以新的識別碼重新建立。邀請識別碼的作用就像密碼，應以類似方式加以保護。此模式可以依照下列步驟實作：

* 外部服務選取一個裝置來建立網路，並指定要使用的邀請識別碼。
* 外部服務將邀請識別碼傳送給應加入網路的所有其他使用者。
* 當有新使用者應加入網路時，外部服務會與該使用者分享目前的邀請識別碼。
* 當擁有目前邀請的使用者不應再被允許加入時，外部服務需要執行下列動作來「變更密碼」。
  * 選取新的邀請識別碼。
  * 要求一位或所有使用者撤銷目前的邀請，並以選取的邀請識別碼建立新的邀請。如需單一使用者管理與所有使用者管理的討論，請參閱[動態單一邀請](#dynamic-single-invitation)。
  * 與現在應被允許加入網路的所有使用者分享新的邀請識別碼。

## 後續步驟

* [了解 PlayFab Party 如何與您的探索流程互動](/zh-TW/services/playfab/multiplayer/networking/concepts-discovery)


## Related topics

- [PlayFab Party 物件及其關聯](/zh-TW/services/playfab/multiplayer/networking/concepts-objects.md)
- [使用 RequestPartyService 從您的服務要求 Party](/zh-TW/services/playfab/multiplayer/networking/party-tutorial-requestpartyservice.md)
- [Party 快速入門](/zh-TW/services/playfab/multiplayer/networking/quickstart.md)
- [GDK 中的 Windows Sockets 簡介](/zh-TW/build/console-features/networking/game-mesh/winsock-intro-networking.md)
- [GDK 被授權人的安全性要求](/zh-TW/home/onboarding-access/security-requirements.md)
