> ## 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.

# Services de chiffrement des joueurs

> Découvrez les secrets partagés de joueur, les clés publiques de titre et les charges utiles d'inscription chiffrées RSA de PlayFab, utilisés pour sécuriser la création de comptes et les demandes de connexion client.

## Secrets partagés de joueur

Les secrets partagés de joueur constituent un nouveau type de pseudo-clé secrète, partagée entre les clients de jeu. À l'aide d'une API, elle peut être échangée contre la clé RSA publique du titre et peut être utilisée pour effectuer l'inscription de comptes.

Les titres peuvent avoir plusieurs clés partagées de joueur, et peuvent les configurer et les révoquer à volonté, via les appels d'API Admin [Create](xref:titleid.playfabapi.com.admin.authentication.createplayersharedsecret), [Update](xref:titleid.playfabapi.com.admin.authentication.updateplayersharedsecret), [Delete](xref:titleid.playfabapi.com.admin.authentication.deleteplayersharedsecret), [List](xref:titleid.playfabapi.com.admin.authentication.getplayersharedsecrets).

Les secrets partagés de joueur doivent être intégrés dans les clients respectifs, car il n'existe aucune API client permettant de les récupérer, qu'elle soit authentifiée ou non.

## Clé publique du titre

Le secret partagé de joueur est ensuite envoyé à [GetTitlePublicKey](xref:titleid.playfabapi.com.client.authentication.gettitlepublickey). Si la clé est valide, l'API renvoie un tableau d'octets de blob CSP RSA encodé en Base 64, capable de chiffrer 237 octets de données.

Toutes les API qui permettent de créer des comptes acceptent désormais la publication d'une demande d'inscription sous forme de charge utile chiffrée dans le champ `EncryptedRequest`.

<Note>
  Les champs standard **`TitleId`**, **`InfoRequestParameters`** et **`CreateAccount`** ne doivent *pas* être inclus dans la charge utile chiffrée.
</Note>

## Utilisation de la clé publique du titre pour l'inscription

Voici un exemple de code permettant d'inscrire un joueur à l'aide de `LoginWithCustomID` et de la clé publique du titre.

```csharp theme={null}
var titleKeyResult = PlayFabClientAPI.GetTitlePublicKey(new GetTitlePublicKeyRequest{ TitleId = "TITLE", TitleSharedSecret = "player shared secret" });

var cspBlob = Convert.FromBase64String(titleKeyResult.RSAPublicKey);

var encryptionModel = JsonConvert.SearializeObject(new LoginWithCustomIDRequest

{
    CustomID = "my player's custom id",
    PlayerSecret = "my player's individual secret"
});

string encryptedPayload;

using (var rsa = new RSACryptoServiceProvider())
{
    rsa.ImportCspBlob(cspBlob);
    var bytesToEncrypt = Encoding.UTF8.GetBytes(encryptionModel);
    var encryptedBytes = rsa.Encrypt(bytesToEncrypt, false);
    encryptedPayload = Convert.ToBase64String(encryptedBytes);
}

var postModel = new LoginWithCustomIDRequest
{
    TitleId = "TITLEID",
    EncryptedRequest = encryptedPayload,
    CreateAccount = True
};

var createAccountResult = PlayFabClientAPI.LoginWithCustomID(postModel);
```

## Secret du joueur

Le nouveau système d'inscription comprend un nouveau champ appelé `PlayerSecret`. S'il est défini, il vous permet de signer les en-têtes de requête, qui sont validés par le serveur lors des appels d'API à tous les services, y compris les demandes de connexion.

Le secret du joueur ne peut être défini qu'*une seule fois* par utilisateur et par titre. Un utilisateur possédant plusieurs titres dans le même studio doit définir le secret du joueur pour chacun d'eux.

Si le secret du joueur n'a pas déjà été défini lors de l'inscription, il est possible de le définir en appelant [SetPlayerSecret](xref:titleid.playfabapi.com.client.authentication.setplayersecret). Il existe des API admin et serveur qui permettent de définir le secret du joueur sur une *nouvelle* valeur, même s'il a déjà été défini.

<Note>
  Une fois défini, le secret du joueur doit être stocké de manière sécurisée sur l'appareil, car il n'est *pas* récupérable en cas de perte, et il n'existe *aucune* API permettant de le récupérer.
</Note>

## Utilisation du secret du joueur pour signer les requêtes d'API

L'exemple de code suivant construit un en-tête de signature pouvant être utilisé pour signer les requêtes d'API. Le format de l'en-tête de signature est présenté ci-dessous.

`jsonRequestModel.utcTimeStampInISO.playerSecret`

```csharp theme={null}
var postModel = new LoginWithCustomIDRequest

{
    TitleId = "TITLEID",
    CustomID =  "my player's custom id",
    CreateAccount = False
};

string signatureHeader;
string timestampHeader = DateTime.UtcNow.ToString("O");

string playerSecret; // the player secret that was sent during registration.

 using (var hash = new SHA256Managed())
{
    var bytesToHash = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(postModel)+"." + timestampHeader + "." + playerSecret);
    signatureHeader = hash.ComputeHash(bytesToHash);
}

var customHeaders = new Dictionary<string, string>
{
    { "X-PlayFab-Signature", signatureHeader },
    { "X-PlayFab-Timestamp", timestampHeader }
}

var loginResult = PLayFabClientAPI.LoginWithCustomID(postModel, customHeaders);
```

## Utilisation de l'application d'une stratégie

Les [stratégies d'API](https://playfab.com/blog/permission-policies/) peuvent désormais être utilisées pour imposer ces scénarios.

* Une requête client est une charge utile chiffrée.
* Une requête client contient des en-têtes signés.

Même *sans* utiliser l'application de stratégie, si une charge utile chiffrée est envoyée (ou si les en-têtes sont envoyés), ils seront validés. S'ils ne sont pas correctement formés, une erreur se produit.

Pour créer une stratégie exigeant des en-têtes sur une API spécifique, utilisez une instruction `Deny`. Cela crée une stratégie exigeant des en-têtes sur *tous* les appels que vous pouvez effectuer et qui ne sont pas autorisés par l'instruction `Allow`.

Les instructions de stratégie possèdent une propriété appelée `ApiConditions`. `ApiConditions` contient une propriété appelée `HasSignatureOrEncryption`, qui est une énumération avec trois valeurs possibles :

* `Any`
* `True`
* `False`

<Note>
  La valeur par défaut (si elle n'est *pas* définie par la stratégie) est **`Any`**.
</Note>

L'exemple de stratégie suivant autorise *tous* les appels d'API (à l'exception des appels non chiffrés ou sans en-têtes) vers `LoginWithCustomID`.

```json theme={null}
{
    "PolicyName": "ApiPolicy",
    "OverwritePolicy": true,
    "Statements":
    [
        {
            "Comment": "Require Headers on LoginWithCustomID",
            "Action": "*",
            "Principal": "*",
            "Effect": "Deny",
            "Resource": "pfrn:api--/Client/LoginWithCustomID",
            "ApiConditions": { "HasSignatureOrEncryption": "False" }
        },
        {
            "Comment": "Allow the rest policy",
            "Action": "*",
            "Principal": "*",
            "Effect": "Allow",
            "Resource": "pfrn:api--*"
        }
    ]
}
```

L'instruction `Deny` ci-dessus contient `HasSignatureOrEncryption: False`. Cela signifie que toutes les requêtes dépourvues de signature ou de chiffrement sont rejetées. En d'autres termes, toutes les requêtes qui *possèdent* des en-têtes de signature ou un chiffrement sont autorisées en vertu de `Allow the rest policy`.


## Related topics

- [Authentification des services XBOX pour les services de titre](/fr/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-title-service-authentication.md)
- [Jetons de sécurité des services XBOX (jetons XSTS)](/fr/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/security-tokens/live-security-tokens.md)
- [Configuration des services web dans Partner Center](/fr/services/xbox-services/fundamentals/s2s-auth-calls/custom-service-config/web-services/live-web-services.md)
- [Configuration des segments de joueurs](/fr/services/playfab/player-progression/player-data/player-segment-configuration.md)
- [Utilisation des statistiques de joueur](/fr/services/playfab/community/leaderboards/tournaments-leaderboards/using-player-statistics.md)
