Shop Builder mit BaaS-Autorisierung verwenden
Sie können Shop Builder zusammen mit dem BaaS-Autorisierungssystem verwenden, um Ingame-Items zu verkaufen. In diesem Fall läuft die Interaktion wie folgt ab:
- Der Benutzer meldet sich über das BaaS-Autorisierungssystem bei Ihrer Anwendung an.
- Der BaaS-Dienst fordert den JWT (JSON Web Token) von den Xsolla-Servern an, indem er die Benutzer-ID übermittelt.
- Die Xsolla-Server senden den Benutzer-JWT an den BaaS-Dienst zurück.
- Der BaaS-Dienst übermittelt den Benutzer-JWT an die Anwendung.
- 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.
- Verknüpfen Sie im Kundenportal das standardmäßige Login-Projekt mit Ihrem Projekt.
- Richten Sie einen OAuth 2.0-Serverclient ein.
- Ergänzen Sie Ihr Projekt um vorgefertigte Funktionen, indem Sie die Anweisungen für Firebase und PlayFab befolgen.
OAuth 2.0-Serverclient einrichten
- Öffnen Sie Ihr Projekt im Kundenportal, und navigieren Sie zum Menüpunkt Spieler > Login.
- Klicken Sie beim gewünschten Login-Projekt auf Konfigurieren.
- Scrollen Sie zum Block Sicherheit, und klicken Sie auf OAuth 2.0.
- Klicken Sie auf OAuth 2.0 hinzufügen.
- Geben Sie die OAuth 2.0-URIs für die Weiterleitung an.
- Aktivieren Sie das Kontrollkästchen Server (Server-zu-Server-Verbindung).
- Klicken Sie auf Verknüpfen.
- Kopieren und speichern Sie die Client-ID und den geheimen Schlüssel.
Cloud Function zum Firebase-Projekt hinzufügen
- Initialisieren Sie Ihr Firebase-Projekt.
- 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 zum Menüpunkt Spieler > 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
- javascript
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}
- Stellen Sie die Funktion, wie in diesem Beispiel gezeigt, in einer Produktionsumgebung bereit.
- 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. - 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
- 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 zum Menüpunkt Spieler > 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.
Copy
- javascript
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}
- Wechseln Sie in die PlayFab-Projekteinstellungen.
- Laden Sie die Cloud Script-Datei hoch.
- Führen Sie das Cloud Script in einer Produktionsumgebung aus.
- 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
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}
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.
- 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 für Ihr Feedback!
Wir werden Ihr Feedback aufgreifen und dazu nutzen, Ihr Erlebnis verbessern.Nützliche Links
Letztmalig aktualisiert: 19. September 2025Haben Sie einen Tippfehler oder einen anderen Textfehler gefunden? Wählen Sie den Text aus und drücken Sie Strg+Eingabe.