Utilizar In-Game Store con autorización de BaaS (Back-end como servicio)

Puedes utilizar In-Game Store 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
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. 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
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. 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++
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
}
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: 3 de Octubre de 2024

¿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!