Utiliser Shop Builder avec l’autorisation BaaS

Vous pouvez utiliser Shop Builder avec le système d’autorisation BaaS pour vendre des objets en jeu. Dans ce cas, l’interaction est comme suit :

  1. L'utilisateur se connecte à votre application via le système d'autorisation BaaS.
  2. Le service BaaS demande le JSON Web Token (JWT) de l'utilisateur aux serveurs Xsolla en passant l'ID de l'utilisateur.
  3. Les serveurs Xsolla renvoient le JWT de l'utilisateur au service BaaS.
  4. Le service BaaS passe le JWT de l'utilisateur à l'application.
  5. L'application utilise le JWT de l'utilisateur pour interagir avec les serveurs Xsolla à l'aide de l'API.
Note
Si vous n’avez pas implémenté la logique d’autorisation utilisateur, vous pouvez intégrer Xsolla Login et configurer le stockage des données utilisateur dans PlayFab ou Firebase. Cela vous permet d’utiliser l’API Login pour authentifier les utilisateurs et obtenir des JWT afin d’interagir avec les API d’autres produits Xsolla.
Pour obtenir le JWT de l’utilisateur :
  1. Dans le Compte éditeur, connectez le projet de connexion standard à votre projet.
  2. Configurer le client OAuth 2.0 serveur.
  3. Ajoutez des fonctions préprogrammées à votre projet en suivant les instructions Firebase et PlayFab.

Configurer le client OAuth 2.0 du serveur

  1. Ouvrez le projet dans le Compte éditeur et accédez à la section Players > Login.
  2. Dans le volet du projet de Login, appuyez sur Configure.
  3. Accédez au bloc Security et sélectionnez la section OAuth 2.0.
  4. Appuyez sur Add OAuth 2.0.
  5. Spécifiez les OAuth 2.0 redirect URIs.
  6. Cochez la case Server (server-to-server connection).
  7. Appuyez sur Connect.
  8. Copiez et enregistrez l'ID client et la clé secrète.

Ajouter une fonction cloud au projet Firebase

  1. Initialisez le projet Firebase.
  2. Importez et configurez la fonction d'obtention du JWT utilisateur, où :
    • <ProjectID> est l'ID de projet, qui se trouve dans le Compte éditeur à côté du nom du projet ;
    • <LoginID> est l'ID de Login. Pour l'obtenir, accédez au Compte éditeur, et, sous la section Players >Login > Dashboard > votre projet de Login, appuyez sur Copy ID à côté du nom du projet de Login ;
    • <OAuthClientID> est l'ID client obtenu lors de la configuration du client OAuth 2.0 du serveur ;
    • <OAuthSecretKey> est la clé secrète obtenue lors de la configuration du client OAuth 2.0 du serveur.

Code de la fonction de réception du JWT de l’utilisateur :

Copy
Full screen
Small screen
  1const projectId = "<ProjectID>";
  2const loginProjectId = "<LoginID>";
  3
  4const serverOauthClientId = <OAuthClientID>;
  5const serverOauthClientSecret = "<OAuthSecretKey>";
  6
  7exports.getXsollaLoginToken = functions.https.onCall((data, context) => {
  8  if (!context.auth) {
  9    throw new functions.https.HttpsError(
 10        "failed-precondition",
 11        "The function must be called while authenticated."
 12    );
 13  }
 14
 15  const postData =
 16      "grant_type=client_credentials" +
 17      `&client_secret=${serverOauthClientSecret}`+
 18      `&client_id=${serverOauthClientId}`;
 19
 20  const options = {
 21    hostname: "login.xsolla.com",
 22    port: 443,
 23    path: "/api/oauth2/token",
 24    method: "POST",
 25    headers: {
 26      "Content-Type": "application/x-www-form-urlencoded",
 27      "Content-Length": postData.length,
 28    },
 29  };
 30
 31  return new Promise( (resolve, reject) => {
 32    const req = https.request(options, (res) => {
 33      if (res.statusCode !== 200) {
 34        reject(
 35            new functions.https.HttpsError(
 36                "internal",
 37                "Server token not received"
 38            )
 39        );
 40      }
 41      let body = [];
 42      res.on("data", (d) => {
 43        body.push(d);
 44      });
 45      res.on("end", () => {
 46        try {
 47          body = JSON.parse(Buffer.concat(body).toString());
 48        } catch (e) {
 49          reject(
 50              new functions.https.HttpsError(
 51                  "internal",
 52                  "Malformed server token response"
 53              )
 54          );
 55        }
 56        getClientToken(context.auth.uid, body.access_token, resolve, reject);
 57      });
 58    });
 59    req.on("error", (e) => {
 60      reject(new functions.https.HttpsError(
 61          "internal",
 62          "Internal error while server token flow"
 63      ));
 64    });
 65
 66    req.write(postData);
 67    req.end();
 68  });
 69});
 70
 71// eslint-disable-next-line require-jsdoc
 72function getClientToken(userId, serverToken, resolve, reject) {
 73  const postData = JSON.stringify(
 74      {
 75        "server_custom_id": userId,
 76      }
 77  );
 78
 79  const path =
 80      "/api/users/login/server_custom_id?" +
 81      `projectId=${loginProjectId}&` +
 82      `publisher_project_id=${projectId}`;
 83
 84  const options = {
 85    hostname: "login.xsolla.com",
 86    port: 443,
 87    path: path,
 88    method: "POST",
 89    headers: {
 90      "Content-Type": "application/json",
 91      "Content-Length": postData.length,
 92      "X-Server-Authorization": serverToken,
 93    },
 94  };
 95
 96  const req = https.request(options, (res) => {
 97    if (res.statusCode !== 200) {
 98      reject(
 99          new functions.https.HttpsError(
100              "internal",
101              "Client token not received"
102          )
103      );
104    }
105    let body = [];
106    res.on("data", (d) => {
107      body.push(d);
108    });
109    res.on("end", () => {
110      try {
111        body = JSON.parse(Buffer.concat(body).toString());
112      } catch (e) {
113        reject(
114            new functions.https.HttpsError(
115                "internal",
116                "Malformed client token response"
117            )
118        );
119      }
120      resolve({
121        "token": body.token,
122      });
123    });
124  });
125  req.on("error", (e) => {
126    reject(new functions.https.HttpsError(
127        "internal",
128        "Internal error while client token flow"
129    ));
130  });
131
132  req.write(postData);
133  req.end();
134}
  1. Déployez la fonction dans un environnement de production conformément à cet exemple.
  2. Ajoutez une logique côté client pour appeler la fonction depuis votre application. Spécifiez getXsollaLoginToken nom de fonction. Il n'est pas nécessaire de passer des paramètres.
  3. Dans l'application, implémentez vous-même des méthodes pour utiliser l'API ou utilisez les SDK Xsolla.

Ajouter un script cloud au projet PlayFab

  1. Créez un fichier JS avec le code de la fonction d'obtention du JWT utilisateur, où :
    • <ProjectID> est l'ID de projet, qui se trouve dans le Compte éditeur à côté du nom du projet ;
    • <LoginID> est l'ID de Login. Pour l'obtenir, accédez au Compte éditeur, et, sous la section Players > Login > Dashboard > votre projet de Login, appuyez sur Copy ID à côté du nom du projet de Login ;
    • <OAuthClientID> est l'ID client obtenu lors de la configuration du client OAuth 2.0 du serveur ;
    • <OAuthSecretKey> est la clé secrète obtenue lors de la configuration du client OAuth 2.0 du serveur.
Note
Si vous utilisez déjà des scripts cloud dans votre projet, ajoutez la fonction d’obtention du JWT de l’utilisateur à la fin du code.
Code de la fonction de réception du JWT de l’utilisateur :
Copy
Full screen
Small screen
 1handlers.GetXsollaLoginToken = function (args) {
 2
 3    // TODO replace with production credentials
 4    const projectId = <ProjectID>;
 5    const loginProjectId = "<LoginID>";
 6    const serverOauthClientId = <OAuthClientID>;
 7    const serverOauthClientSecret = "<OAuthSecretKey>";
 8
 9    const getServerTokenBody =
10        "grant_type=client_credentials" +
11        `&client_secret=${serverOauthClientSecret}` +
12        `&client_id=${serverOauthClientId}`;
13
14    const serverTokenResponse = JSON.parse(
15        http.request(
16            "https://login.xsolla.com/api/oauth2/token",
17            "post",
18            getServerTokenBody,
19            "application/x-www-form-urlencoded",
20            {})
21    );
22
23    let serverToken = ""
24    if ('access_token' in serverTokenResponse) {
25        serverToken = serverTokenResponse.access_token;
26    } else {
27        return {
28            "error_message": "Server token not received"
29        }
30    }
31
32    const getUserTokenHeaders = {
33        "X-Server-Authorization": serverToken
34    }
35
36    const getUserTokenBody = JSON.stringify(
37        {
38            "server_custom_id": currentPlayerId,
39        }
40    );
41
42    const getUserTokenPath =
43        "/api/users/login/server_custom_id?" +
44        `projectId=${loginProjectId}&` +
45        `publisher_project_id=${projectId}`;
46
47    const userTokenResponse = JSON.parse(
48        http.request(
49            "https://login.xsolla.com" + getUserTokenPath,
50            "post",
51            getUserTokenBody,
52            "application/json",
53            getUserTokenHeaders)
54    );
55
56    if ('token' in userTokenResponse) {
57        return {
58            "token": userTokenResponse.token
59        }
60    } else {
61        return {
62            "error_message": "User token not received"
63        }
64    }
65}

  1. Accédez aux paramètres du projet PlayFab.
  2. Chargez le fichier du script cloud.
  3. Exécutez le script cloud dans un environnement de production.
  4. Ajoutez une logique côté client pour appeler la fonction depuis votre application. Spécifiez GetXsollaLoginToken comme nom de fonction. Il n'est pas nécessaire de passer des paramètres.

Exemple d’appel de la fonction d’obtention du JWT de l’utilisateur :

Copy
Full screen
Small screen

kotlin

  • kotlin
  • C#
  • C++
1val tokenRequest = PlayFabClientModels.ExecuteCloudScriptRequest()
2tokenRequest.FunctionName = "GetXsollaLoginToken"
3val res = PlayFabClientAPI.ExecuteCloudScript(tokenRequest)
4val result = res.Result.FunctionResult as Map<*, *>
5val token = result["token"]
6val errorMessage = result["error_message"]
 1var tokenRequest = new ExecuteCloudScriptRequest{
 2  FunctionName = "GetXsollaLoginToken"
 3};
 4
 5PlayFabClientAPI.ExecuteCloudScript(
 6  tokenRequest,
 7  scriptResult =>
 8  {
 9     var functionResult = scriptResult.FunctionResult as Dictionary<string, string>;
10     var token = functionResult["token"];
11  },
12  playfabError => { Debug.LogError($"GetXsollaAccessToken error: {playfabError.ErrorMessage}"); });
 1void UMyClass::GetXsollaToken()
 2{
 3    FClientExecuteCloudScriptRequest tokenRequest;
 4    tokenRequest.FunctionName = TEXT("GGetXsollaLoginToken");
 5
 6    UPlayFabClientAPI::FDelegateOnSuccessExecuteCloudScript onSuccess;
 7    onSuccess.BindUFunction(this, "OnTokenRecieved");
 8
 9    UPlayFabClientAPI::FDelegateOnFailurePlayFabError onFailure;
10    onSuccess.BindUFunction(this, "OnError");
11
12    UPlayFabClientAPI::ExecuteCloudScript(tokenRequest, onSuccess, onFailure, nullptr);
13}
14
15void UMyClass::OnTokenRecieved(FClientExecuteCloudScriptResult result, UObject* customData)
16{
17    const FString& token = result.FunctionResult->GetStringField(TEXT("token"));
18
19    // do something with a token
20}
21
22void UMyClass::OnError(FPlayFabError error, UObject* customData)
23{
24    // handle errors
25}
Note
Dans cet exemple, nous utilisons les méthodes SDK PlayFab pour envoyer une requête au script cloud. Vous pouvez implémenter vous-même le traitement des requêtes et des réponses sans ajouter le SDK PlayFab à votre projet.
  1. Dans l'application, implémentez vous-même des méthodes pour utiliser l' API ou utilisez les SDK Xsolla.
Cet article vous a été utile ?
Merci !
Que pouvons-nous améliorer ? Message
Nous sommes désolés de l'apprendre
Dites-nous pourquoi vous n'avez pas trouvé cet article utile. Message
Merci pour votre commentaire !
Nous examinerons votre message et l'utiliserons pour améliorer votre expérience.

Liens utiles

Dernière mise à jour: 19 Septembre 2025

Faute de frappe ou autre erreur dans le texte ? Sélectionnez le texte concerné et appuyez sur Ctrl+Entrée.

Signaler un problème
Nous améliorons continuellement notre contenu grâce à vos commentaires.
Indiquez votre adresse e-mail pour un suivi
Merci pour votre commentaire !
Impossible d'envoyer votre commentaire
Réessayez plus tard ou contactez-nous à doc_feedback@xsolla.com.