Utiliser In-Game Store avec l’autorisation BaaS

Vous pouvez utiliser In-Game Store 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 votre projet dans le Compte éditeur et accédez à la section Login.
  2. Dans le volet du projet de connexion, cliquez sur Configure.
  3. Accédez au bloc Security et sélectionnez la section OAuth 2.0.
  4. Cliquez sur Add OAuth 2.0.
  5. Spécifiez les OAuth 2.0 redirect URIs.
  6. Cochez la case Server (server-to-server connection).
  7. Cliquez sur Connect.
  8. Copiez et enregistrez l'ID client et la clé secrète.

Ajouter une fonction cloud au projet Firebase

  1. Initialisez votre projet Firebase.
  2. Importez et configurez la fonction d'obtention du JWT de l'utilisateur, où :
    • <ProjectID> est l'ID de projet, qui se trouve dans le Compte éditeur à côté du nom de votre projet ;
    • <LoginID> est l'ID de connexion. Pour l'obtenir, accédez au Compte éditeur, et, sous la section Login > Dashboard > votre projet de connexion, cliquez sur Copy ID à côté du nom du projet de connexion ;
    • <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 laconfiguration du client OAuth 2.0 du serveur.

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

Copy
Full screen
Small screen
const projectId = "<ProjectID>";
const loginProjectId = "<LoginID>";

const serverOauthClientId = <OAuthClientID>;
const serverOauthClientSecret = "<OAuthSecretKey>";

exports.getXsollaLoginToken = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError(
        "failed-precondition",
        "The function must be called while authenticated."
    );
  }

  const postData =
      "grant_type=client_credentials" +
      `&client_secret=${serverOauthClientSecret}`+
      `&client_id=${serverOauthClientId}`;

  const options = {
    hostname: "login.xsolla.com",
    port: 443,
    path: "/api/oauth2/token",
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      "Content-Length": postData.length,
    },
  };

  return new Promise( (resolve, reject) => {
    const req = https.request(options, (res) => {
      if (res.statusCode !== 200) {
        reject(
            new functions.https.HttpsError(
                "internal",
                "Server token not received"
            )
        );
      }
      let body = [];
      res.on("data", (d) => {
        body.push(d);
      });
      res.on("end", () => {
        try {
          body = JSON.parse(Buffer.concat(body).toString());
        } catch (e) {
          reject(
              new functions.https.HttpsError(
                  "internal",
                  "Malformed server token response"
              )
          );
        }
        getClientToken(context.auth.uid, body.access_token, resolve, reject);
      });
    });
    req.on("error", (e) => {
      reject(new functions.https.HttpsError(
          "internal",
          "Internal error while server token flow"
      ));
    });

    req.write(postData);
    req.end();
  });
});

// eslint-disable-next-line require-jsdoc
function getClientToken(userId, serverToken, resolve, reject) {
  const postData = JSON.stringify(
      {
        "server_custom_id": userId,
      }
  );

  const path =
      "/api/users/login/server_custom_id?" +
      `projectId=${loginProjectId}&` +
      `publisher_project_id=${projectId}`;

  const options = {
    hostname: "login.xsolla.com",
    port: 443,
    path: path,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": postData.length,
      "X-Server-Authorization": serverToken,
    },
  };

  const req = https.request(options, (res) => {
    if (res.statusCode !== 200) {
      reject(
          new functions.https.HttpsError(
              "internal",
              "Client token not received"
          )
      );
    }
    let body = [];
    res.on("data", (d) => {
      body.push(d);
    });
    res.on("end", () => {
      try {
        body = JSON.parse(Buffer.concat(body).toString());
      } catch (e) {
        reject(
            new functions.https.HttpsError(
                "internal",
                "Malformed client token response"
            )
        );
      }
      resolve({
        "token": body.token,
      });
    });
  });
  req.on("error", (e) => {
    reject(new functions.https.HttpsError(
        "internal",
        "Internal error while client token flow"
    ));
  });

  req.write(postData);
  req.end();
}
  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 de l'utilisateur, où :
    • <ProjectID> est l'ID de projet, qui se trouve dans le Compte éditeur à côté du nom de votre projet ;
    • <LoginID> est l'ID de connexion. Pour l'obtenir, accédez au Compte éditeur, et, sous la section Login > Dashboard > votre projet de connexion, cliquez sur Copy ID à côté du nom du projet de connexion ;
    • <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
handlers.GetXsollaLoginToken = function (args) {

    // TODO replace with production credentials
    const projectId = <ProjectID>;
    const loginProjectId = "<LoginID>";
    const serverOauthClientId = <OAuthClientID>;
    const serverOauthClientSecret = "<OAuthSecretKey>";

    const getServerTokenBody =
        "grant_type=client_credentials" +
        `&client_secret=${serverOauthClientSecret}` +
        `&client_id=${serverOauthClientId}`;

    const serverTokenResponse = JSON.parse(
        http.request(
            "https://login.xsolla.com/api/oauth2/token",
            "post",
            getServerTokenBody,
            "application/x-www-form-urlencoded",
            {})
    );

    let serverToken = ""
    if ('access_token' in serverTokenResponse) {
        serverToken = serverTokenResponse.access_token;
    } else {
        return {
            "error_message": "Server token not received"
        }
    }

    const getUserTokenHeaders = {
        "X-Server-Authorization": serverToken
    }

    const getUserTokenBody = JSON.stringify(
        {
            "server_custom_id": currentPlayerId,
        }
    );

    const getUserTokenPath =
        "/api/users/login/server_custom_id?" +
        `projectId=${loginProjectId}&` +
        `publisher_project_id=${projectId}`;

    const userTokenResponse = JSON.parse(
        http.request(
            "https://login.xsolla.com" + getUserTokenPath,
            "post",
            getUserTokenBody,
            "application/json",
            getUserTokenHeaders)
    );

    if ('token' in userTokenResponse) {
        return {
            "token": userTokenResponse.token
        }
    } else {
        return {
            "error_message": "User token not received"
        }
    }
}

  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++
val tokenRequest = PlayFabClientModels.ExecuteCloudScriptRequest()
tokenRequest.FunctionName = "GetXsollaLoginToken"
val res = PlayFabClientAPI.ExecuteCloudScript(tokenRequest)
val result = res.Result.FunctionResult as Map<*, *>
val token = result["token"]
val errorMessage = result["error_message"]
var tokenRequest = new ExecuteCloudScriptRequest{
  FunctionName = "GetXsollaLoginToken"
};

PlayFabClientAPI.ExecuteCloudScript(
  tokenRequest,
  scriptResult =>
  {
     var functionResult = scriptResult.FunctionResult as Dictionary<string, string>;
     var token = functionResult["token"];
  },
  playfabError => { Debug.LogError($"GetXsollaAccessToken error: {playfabError.ErrorMessage}"); });

void UMyClass::GetXsollaToken()
{
    FClientExecuteCloudScriptRequest tokenRequest;
    tokenRequest.FunctionName = TEXT("GGetXsollaLoginToken");

    UPlayFabClientAPI::FDelegateOnSuccessExecuteCloudScript onSuccess;
    onSuccess.BindUFunction(this, "OnTokenRecieved");

    UPlayFabClientAPI::FDelegateOnFailurePlayFabError onFailure;
    onSuccess.BindUFunction(this, "OnError");

    UPlayFabClientAPI::ExecuteCloudScript(tokenRequest, onSuccess, onFailure, nullptr);
}

void UMyClass::OnTokenRecieved(FClientExecuteCloudScriptResult result, UObject* customData)
{
    const FString& token = result.FunctionResult->GetStringField(TEXT("token"));

    // do something with a token
}

void UMyClass::OnError(FPlayFabError error, UObject* customData)
{
    // handle errors
}
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.
Évaluer cette page
Évaluer cette page
Que pouvons-nous améliorer ?

Préfère ne pas répondre

Merci pour votre commentaire !

Liens utiles

Dernière mise à jour: 22 Janvier 2024

Faute de frappe ou autre erreur dans le texte ? Sélectionnez le texte concerné et appuyez sur Ctrl+Enté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 !