Use a In-Game Store com autorização BaaS

Você pode usar a In-Game Store com o sistema de autorização BaaS para vender itens no jogo. Nesse caso, a interação é a seguinte:

  1. O usuário efetua o login em seu aplicativo por meio do sistema de autorização BaaS.
  2. O serviço BaaS solicita o JSON Web Token (JWT) do usuário aos servidores Xsolla passando o ID do usuário.
  3. Os servidores Xsolla retornam o JWT do usuário para o serviço BaaS.
  4. O serviço BaaS passa o JWT do usuário para o aplicativo.
  5. O aplicativo usa o JWT do usuário para interagir com os servidores Xsolla usando a API.
Observação
Se você não tiver implementado a lógica para autorização do usuário, você poderá integrar o Xsolla Login e configurar o armazenamento de dados do usuário no PlayFab ou no Firebase. Isso permite que você use a API Login para autenticar usuários e receber JWTs para interagir com as APIs de outros produtos Xsolla.
Para obter JWTs de usuários:
  1. na Conta de Distribuidor, conecte o projeto Login padrão ao seu projeto.
  2. Configure um cliente do servidor OAuth 2.0.
  3. Adicione funções prontas ao seu projeto seguindo as instruções para Firebase e PlayFab.

Configure o cliente OAuth 2.0 do servidor

  1. Abra seu projeto na Conta de Distribuidor e vá para a seção Login.
  2. Clique em Configure no painel de um projeto Login.
  3. Vá para o bloco Security e selecione a seção OAuth 2.0.
  4. Clique em Add OAuth 2.0.
  5. Especifique os URLs de redirecionamento OAuth 2.0.
  6. Marque a caixa Server (server-to-server connection).
  7. Clique em Connect.
  8. Copie e salve o ID do cliente e chave secreta.

Adicione a Cloud Function ao projeto Firebase

  1. Inicialize seu projeto Firebase.
  2. Importe e configure a função de recebimento para o usuário JWT, onde:
    • <ProjectID> é a ID do projeto e pode ser encontrada em sua Conta de Distribuidor ao lado do nome do seu projeto.
    • <LoginID> é o ID de Login que pode ser obtido abrindo a Conta de Distribuidor. Vá para a seção Login > Dashboard > Seu projeto Login e clique em Copy ID próximo ao nome do projeto de login.
    • <OAuthClientID> é o ID do cliente recebido quando você configurou o cliente do servidor OAuth 2.0.
    • <OAuthSecretKey> é a chave secreta que foi recebida ao configurar o cliente do servidor OAuth 2.0.

Código de função para receber o usuário JWT:

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. Mobilize a função a um ambiente de produção conforme este exemplo.
  2. Adicione a lógica no lado do cliente para chamar a função do seu aplicativo. Especifique getXsollaLoginToken como o nome da função. Não é necessário passar parâmetros.
  3. No aplicativo, implemente métodos para trabalhar com a API você mesmo ou use os SDKs Xsolla.

Adicione o Cloud Script ao projeto PlayFab

  1. Crie um arquivo JS com o código de função para receber o usuário JWT, onde:
    • <ProjectID> é o ID do projeto e pode ser encontrado em sua Conta do Publisher ao lado do nome do seu projeto.
    • <LoginID> é o ID de login que pode ser obtido abrindo a Conta do Publicador, vá para a seção Login > Dashboard > Seu projeto Login e clique em Copy ID ao lado do nome do projeto de login.
    • <OAuthClientID> é o ID do cliente recebido quando você configura o cliente OAuth 2.0 do servidor.
    • <OAuthSecretKey> é a chave secreta que é recebida quando você configura o cliente OAuth 2.0 do servidor.
Observação
Se você já estiver usando Cloud Scripts em seu projeto, adicione a função para receber o usuário JWT ao final do código.
Código de função para receber o usuário JWT:
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. Vá para as configurações do projeto PlayFab.
  2. Carregue o arquivo do Cloud Script.
  3. Execute o Cloud Script em um ambiente de produção.
  4. Adicione a lógica do lado do cliente para chamar uma função do seu aplicativo. Especifique GetXsollaLoginToken como o nome da função. Não é necessário passar parâmetros.

Exemplo de chamada da função de recebimento para o JWT do usuário:

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
}
Observação
Neste exemplo, usamos os métodos PlayFab SDK para fazer uma solicitação ao Cloud Script. Você mesmo pode implementar o processamento de solicitação e resposta sem adicionar o SDK do PlayFab ao seu projeto.
  1. No aplicativo, implemente métodos para trabalhar com a API você mesmo ou use SDKs Xsolla.
Este artigo foi útil?
Obrigado!
Podemos melhorar alguma coisa? Mensagem
Que pena ouvir isso
Explique porque este artigo não foi útil para você. Mensagem
Obrigado pelo seu feedback!
Avaliaremos sua mensagem e a usaremos para melhorar sua experiência.

Links úteis

Última atualização: 3 de Outubro de 2024

Encontrou um erro de texto ou digitação? Selecione o texto e pressione Ctrl+Enter.

Relatar um problema
Nós sempre avaliamos nossos conteúdos. Seu feedback nos ajuda a melhorá-los.
Forneça um e-mail para que possamos responder
Obrigado pelo seu feedback!