In-Game Store mit BaaS-Autorisierung verwenden

Sie können In-Game Store zusammen mit dem BaaS-Autorisierungssystem verwenden, um Ingame-Items zu verkaufen. In diesem Fall läuft die Interaktion wie folgt ab:

  1. Der Benutzer meldet sich über das BaaS-Autorisierungssystem bei Ihrer Anwendung an.
  2. Der BaaS-Dienst fordert den JWT (JSON Web Token) von den Xsolla-Servern an, indem er die Benutzer-ID übermittelt.
  3. Die Xsolla-Server senden den Benutzer-JWT an den BaaS-Dienst zurück.
  4. Der BaaS-Dienst übermittelt den Benutzer-JWT an die Anwendung.
  5. Die Anwendung verwendet den Benutzer-JWT, um mit den Xsolla-Servern über die API zu interagieren.
Hinweis
Wenn Sie die Logik für die Benutzerautorisierung nicht implementiert haben, können Sie Xsolla Login integrieren und so einrichten, dass Nutzerdaten in PlayFab oder Firebase gespeichert werden. Sodann können Sie mithilfe der Login-API Benutzer authentifizieren und JWTs empfangen, um mit den APIs anderer Xsolla-Produkte zu interagieren.
So rufen Sie JWTs ab:
  1. Verknüpfen Sie im Kundenportal das standardmäßige Login-Projekt mit Ihrem Projekt.
  2. Richten Sie einen OAuth 2.0-Serverclient ein.
  3. Ergänzen Sie Ihr Projekt um vorgefertigte Funktionen, indem Sie die Anweisungen für Firebase und PlayFab befolgen.

OAuth 2.0-Serverclient einrichten

  1. Öffnen Sie Ihr Projekt im Kundenportal, und wechseln Sie zum Abschnitt Login.
  2. Klicken Sie beim gewünschten Login-Projekt auf Konfigurieren.
  3. Scrollen Sie zum Block Sicherheit, und klicken Sie auf OAuth 2.0.
  4. Klicken Sie auf OAuth 2.0 hinzufügen.
  5. Geben Sie die OAuth 2.0-URIs für die Weiterleitung an.
  6. Aktivieren Sie das Kontrollkästchen Server (Server-zu-Server-Verbindung).
  7. Klicken Sie auf Verknüpfen.
  8. Kopieren und speichern Sie die Client-ID und den geheimen Schlüssel.

Cloud Function zum Firebase-Projekt hinzufügen

  1. Initialisieren Sie Ihr Firebase-Projekt.
  2. Importieren und konfigurieren Sie die Empfangsfunktion für den Benutzer-JWT, wobei:
    • <ProjectID> der Projekt-ID entspricht, die im Kundenportal neben dem Namen Ihres Projekts angezeigt wird.
    • <LoginID> der Login-ID entspricht. Navigieren Sie dazu im Kundenportal zu Login > Dashboard > Ihr Login-Projekt, und klicken Sie dort neben dem Namen des Login-Projekts auf ID kopieren.
    • <OAuthClientID> der Client-ID entspricht, die Sie beim Einrichten des OAuth 2.0-Serverclients erhalten haben.
    • <OAuthSecretKey> dem geheimen Schlüssel entspricht, den Sie beim Einrichten des OAuth 2.0-Serverclients erhalten haben.

Funktionscode für den Empfang des Benutzer-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. Stellen Sie die Funktion, wie in diesem Beispiel gezeigt, in einer Produktionsumgebung bereit.
  2. Fügen Sie die clientseitige Logik hinzu, um eine Funktion aus Ihrer Anwendung aufrufen zu können. Geben Sie als Funktionsnamen die Bezeichnung getXsollaLoginToken an. Es müssen keine Parameter übermittelt werden.
  3. Implementieren Sie in der Anwendung selbstständig Methoden für die Arbeit mit der API oder verwenden Sie die Xsolla-SDKs.

Cloud Script zum PlayFab-Projekt hinzufügen

  1. Erstellen Sie eine JS-Datei mit dem Funktionscode für den Empfang des Benutzer-JWT, wobei:
    • <ProjectID> der Projekt-ID entspricht, die im Kundenportal neben dem Namen Ihres Projekts angezeigt wird.
    • <LoginID> der Login-ID entspricht. Navigieren Sie dazu im Kundenportal zu Login > Dashboard > Ihr Login-Projekt, und klicken Sie dort neben dem Namen des Login-Projekts auf ID kopieren.
    • <OAuthClientID> der Client-ID entspricht, die Sie beim Einrichten des OAuth 2.0-Serverclients erhalten haben.
    • <OAuthSecretKey> dem geheimen Schlüssel entspricht, den Sie beim Einrichten des OAuth 2.0-Serverclients erhalten haben.
Hinweis
Wenn Sie bereits Cloud Scripts in Ihrem Projekt verwenden, fügen Sie die Funktion für den Empfang des Benutzer-JWT am Ende des Codes hinzu.
Funktionscode für den Empfang des Benutzer-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. Wechseln Sie in die PlayFab-Projekteinstellungen.
  2. Laden Sie die Cloud Script-Datei hoch.
  3. Führen Sie das Cloud Script in einer Produktionsumgebung aus.
  4. Fügen Sie die clientseitige Logik hinzu, um eine Funktion aus Ihrer Anwendung aufrufen zu können. Geben Sie als Funktionsnamen die Bezeichnung GetXsollaLoginToken an. Es müssen keine Parameter übermittelt werden.

Beispielhafter Aufruf der Empfangsfunktion für den Benutzer-JWT:

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
}
Hinweis
In diesem Beispiel verwenden wir die Methoden des PlayFab SDK, um eine Anfrage an das Cloud Skript zu stellen. Sie können die Anfrage- und Antwortverarbeitung selbst implementieren, ohne das PlayFab SDK zu Ihrem Projekt hinzuzufügen.
  1. Implementieren Sie in der Anwendung eigenständig Methoden für die Arbeit mit der API oder verwenden Sie Xsolla-SDKs.
War dieser Artikel hilfreich?
Vielen Dank!
Gibt es etwas, das wir verbessern können? Nachricht
Das tut uns leid
Bitte erläutern Sie, weshalb dieser Artikel nicht hilfreich ist. Nachricht
Vielen Dank für Ihr Feedback!
Wir werden Ihr Feedback aufgreifen und dazu nutzen, Ihr Erlebnis verbessern.

Nützliche Links

Letztmalig aktualisiert: 3. Oktober 2024

Haben Sie einen Tippfehler oder einen anderen Textfehler gefunden? Wählen Sie den Text aus und drücken Sie Strg+Eingabe.

Problem melden
Wir überprüfen unsere Inhalte ständig. Ihr Feedback hilft uns, sie zu verbessern.
Geben Sie eine E-Mail-Adresse an, damit wir Sie erreichen können
Vielen Dank für Ihr Feedback!