Utilice Shop Builder con autorización de BaaS

Puede utilizar Shop Builder con el sistema de autorización de BaaS para vender artículos del juego. En este caso, la interacción es la siguiente:

  1. El usuario inicia sesión en su aplicación mediante el sistema de autorización de BaaS.
  2. El servicio BaaS solicita el JSON Web Token (JWT) de usuario a los servidores de Xsolla transmitiendo el ID de usuario.
  3. Los servidores de Xsolla devuelven el JWT de usuario al servicio BaaS.
  4. El servicio BaaS transmite el JWT del usuario a la aplicación.
  5. La aplicación utiliza el JWT del usuario para interactuar con los servidores de Xsolla usando la API.
Nota
Si no ha implementado la lógica para la autorización de usuarios, puede integrar Xsolla Login y configurar el almacenamiento de los datos de usuario en PlayFab o Firebase. Esto le permite utilizar la Login API para autenticar usuarios y recibir el JWT para interactuar con las API de otros productos de Xsolla.
Para obtener tókenes JWT de usuario:
  1. En Cuenta del editor, conecte el proyecto estándar de Login a su proyecto.
  2. Configure un cliente de OAuth 2.0 del servidor.
  3. Agregue funciones predefinidas a su proyecto siguiendo las instrucciones para Firebase y PlayFab.

Establecer el cliente de OAuth 2.0

  1. Abra su proyecto en Cuenta del editor y vaya a la sección Login.
  2. Haga clic en Configure en el panel de un proyecto de Login.
  3. Vaya al bloque Security y seleccione la sección OAuth 2.0.
  4. Haga clic en Add OAuth 2.0.
  5. Especifique OAuth 2.0 redirect URIs.
  6. Marque la casilla Server (server-to-server connection).
  7. Haga clic en Connect.
  8. Copie y guarde el ID de cliente y la clave secreta.

Añadir Cloud Function al proyecto Firebase

  1. Inicialice su proyecto de Firebase.
  2. Importe y configure la función de recepción para el JWT de usuario, en el cual:
    • <ProjectID> es el ID del proyecto, y se puede encontrar en su Cuenta del editor junto al nombre de su proyecto.
    • <LoginID> es el ID de Login (inicio de sesión) que se puede obtener abriendo Cuenta del editor, vaya a la sección Login > Dashboard > tu proyecto de Login y haga clic en Copy ID junto al nombre del proyecto de Login.
    • <OAuthClientID> es el ID de cliente recibido al configurar el cliente de OAuth 2.0 del servidor.
    • <OAuthSecretKey> es la clave secreta que se recibe al configurar el cliente de OAuth 2.0 del servidor.

Código de función para recibir el JWT del usuario:

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. Instale la función en un entorno de producción según este ejemplo.
  2. Añada la lógica del lado del cliente para llamar a una función desde su aplicación. Especifique getXsollaLoginToken como el nombre de la función. No es necesario transmitir parámetros.
  3. En la aplicación, implemente métodos para trabajar con la API por sus medios o utilice los kits SDK de Xsolla .

Añadir Cloud Script al proyecto PlayFab

  1. Cree un archivo JS con el código de función para recibir el JWT del usuario, en el cual:
    • <ProjectID> es el ID del proyecto, y se puede encontrar en su Cuenta del editor junto al nombre de su proyecto.
    • <LoginID> es el ID de Login (inicio de sesión) que se puede obtener abriendo Cuenta del editor, vaya a la sección Login > Dashboard > tu proyecto de Login y haga clic en Copy ID junto al nombre del proyecto de Login.
    • <OAuthClientID> es el ID de cliente recibido al configurar el cliente de OAuth 2.0 del servidor.
    • <OAuthSecretKey> es la clave secreta que se recibe al configurar el cliente de OAuth 2.0 del servidor.
Nota
Si ya está utilizando Cloud Scripts en su proyecto, añada la función para recibir el JWT del usuario al final del código.
Código de función para recibir el JWT del usuario:
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. Vaya a la configuración del proyecto de PlayFab.
  2. Cargue el archivo Cloud Script.
  3. Ejecute el Cloud Script en un entorno de producción.
  4. Añada la lógica del lado del cliente para llamar a una función desde su aplicación. Especifique GetXsollaLoginToken como el nombre de la función. No es necesario transmitir parámetros.

Ejemplo de llamada a la función de recepción para el JWT de usuario:

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}
Nota
En este ejemplo, usamos los métodos de PlayFab SDK para hacer una petición al Cloud Script. Puede implementar el procesamiento de la solicitud y la respuesta por sus medios sin agregar el SDK de PlayFab a su proyecto.
  1. En la aplicación, implemente por sus medios los métodos para trabajar con la API o use los kits SDK de Xsolla.
¿Te ha resultado útil este artículo?
¡Gracias!
¿Hay algo en lo que podamos mejorar? Mensaje
Lo sentimos
Por favor, cuéntanos por qué no te ha resultado útil este artículo. Mensaje
¡Gracias por tu mensaje!
Nos ayudará a mejorar tu experiencia.

Enlaces útiles

Última actualización: 20 de Junio de 2025

¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.

Informar de un problema
Nos esforzamos por ofrecer contenido de calidad. Tus comentarios nos ayudan a mejorar.
Déjanos tu correo electrónico para que te podamos responder
¡Gracias por tu mensaje!
No hemos podido enviar sus comentarios
Vuelva a intentarlo más tarde o escríbanos a doc_feedback@xsolla.com.