Использование Shop Builder с BaaS-авторизацией
Вы можете использоватьShop Builder для продажи внутриигровых товаров совместно с системой авторизации BaaS-сервисов. При этом сценарий взаимодействия будет следующим:
- Пользователь авторизуется в вашем приложении через систему авторизации BaaS-сервиса.
- BaaS-сервис запрашивает у серверов Xsolla JSON Web Token (JWT) пользователя, передавая ID пользователя.
- Сервер Xsolla возвращает JWT пользователя в BaaS-сервис.
- BaaS-сервис передает JWT пользователя приложению.
- Приложение использует JWT пользователя для взаимодействия с серверами Xsolla с помощью API.
Примечание
Если вы еще не реализовали логику для авторизации пользователей, вы можете подключить Xsolla Login и настроить хранение пользовательских данных в PlayFab или Firebase. Вы сможете использовать Login API, чтобы аутентифицировать пользователей и получать JWT для взаимодействия с API других продуктов Xsolla.
- В Личном кабинете подключите к проекту стандартный вариант авторизации.
- Настройте серверный OAuth 2.0-клиент.
- Добавьте в проект готовые функции, следуя инструкциям для Firebase и PlayFab.
Настройка серверного OAuth 2.0-клиента
- Откройте проект в Личном кабинете и перейдите в раздел Игроки > Авторизация.
- Нажмите Настроить в панели нужного варианта авторизации.
- На странице навигации перейдите к блоку Безопасность и выберите раздел OAuth 2.0 аутентификация.
- Нажмите Добавить OAuth 2.0.
- Укажите URI переадресации OAuth 2.0.
- Установите флажок Серверная (соединение server-to-server).
- Нажмите Подключить.
- Скопируйте и сохраните ID клиента и секретный ключ.
Добавление облачной функции в проект Firebase
- Инициализируйте свой проект Firebase.
- Импортируйте функцию получения JWT пользователя, где:
<ProjectID>
— ID проекта, который можно найти в Личном кабинете рядом с названием проекта.<LoginID>
— ID варианта авторизации. Чтобы получить его, откройте проект в Личном кабинете, перейдите в раздел Игроки > Авторизация > Дашборд > проект авторизации и нажмите Скопировать ID рядом с названием варианта авторизации.<OAuthClientID>
— ID клиента, полученный при настройке серверного OAuth 2.0-клиента.<OAuthSecretKey>
— секретный ключ, полученный при настройке серверного OAuth 2.0-клиента.
Код функции получения 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&client_secret=${serverOauthClientSecret}&client_id=${serverOauthClientId}`;
17
18 const options = {
19 hostname: "login.xsolla.com",
20 port: 443,
21 path: "/api/oauth2/token",
22 method: "POST",
23 headers: {
24 "Content-Type": "application/x-www-form-urlencoded",
25 "Content-Length": postData.length,
26 },
27 };
28
29 return new Promise( (resolve, reject) => {
30 const req = https.request(options, (res) => {
31 if (res.statusCode !== 200) {
32 reject(
33 new functions.https.HttpsError(
34 "internal",
35 "Server token not received"
36 )
37 );
38 }
39 let body = [];
40 res.on("data", (d) => {
41 body.push(d);
42 });
43 res.on("end", () => {
44 try {
45 body = JSON.parse(Buffer.concat(body).toString());
46 } catch (e) {
47 reject(
48 new functions.https.HttpsError(
49 "internal",
50 "Malformed server token response"
51 )
52 );
53 }
54 getClientToken(context.auth.uid, body.access_token, resolve, reject);
55 });
56 });
57 req.on("error", (e) => {
58 reject(new functions.https.HttpsError(
59 "internal",
60 "Internal error while server token flow"
61 ));
62 });
63
64 req.write(postData);
65 req.end();
66 });
67});
68
69// eslint-disable-next-line require-jsdoc
70function getClientToken(userId, serverToken, resolve, reject) {
71 const postData = JSON.stringify(
72 {
73 "server_custom_id": userId,
74 }
75 );
76
77 const path =
78 `/api/users/login/server_custom_id?projectId=${loginProjectId}&publisher_project_id=${projectId}`;
79
80 const options = {
81 hostname: "login.xsolla.com",
82 port: 443,
83 path: path,
84 method: "POST",
85 headers: {
86 "Content-Type": "application/json",
87 "Content-Length": postData.length,
88 "X-Server-Authorization": serverToken,
89 },
90 };
91
92 const req = https.request(options, (res) => {
93 if (res.statusCode !== 200) {
94 reject(
95 new functions.https.HttpsError(
96 "internal",
97 "Client token not received"
98 )
99 );
100 }
101 let body = [];
102 res.on("data", (d) => {
103 body.push(d);
104 });
105 res.on("end", () => {
106 try {
107 body = JSON.parse(Buffer.concat(body).toString());
108 } catch (e) {
109 reject(
110 new functions.https.HttpsError(
111 "internal",
112 "Malformed client token response"
113 )
114 );
115 }
116 resolve({
117 "token": body.token,
118 });
119 });
120 });
121 req.on("error", (e) => {
122 reject(new functions.https.HttpsError(
123 "internal",
124 "Internal error while client token flow"
125 ));
126 });
127
128 req.write(postData);
129 req.end();
130}
- Запустите функцию в боевой среде в соответствии с примером.
- Добавьте клиентскую логику для вызова функции из приложения. Укажите имя функции —
getXsollaLoginToken
, передача параметров не требуется. - В приложении реализуйте методы для работы с API самостоятельно или воспользуйтесь Xsolla SDK.
Добавление облачного скрипта в проект PlayFab
- Создайте JS-файл с кодом функции получения JWT пользователя, где:
<ProjectID>
— ID проекта, который можно найти в Личном кабинете рядом с названием проекта.<LoginID>
— ID варианта авторизации. Чтобы получить его, откройте проект в Личном кабинете, перейдите в раздел Игроки > Авторизация > Дашборд > проект авторизации и нажмите Скопировать ID рядом с названием варианта авторизации.<OAuthClientID>
— ID клиента, полученный при настройке серверного OAuth 2.0-клиента.<OAuthSecretKey>
— секретный ключ, полученный при настройке серверного OAuth 2.0-клиента.
Примечание
Если вы уже используете облачные скрипты в проекте, добавьте функцию получения JWT пользователя в конец кода.
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&client_secret=${serverOauthClientSecret}&client_id=${serverOauthClientId}`;
11
12 const serverTokenResponse = JSON.parse(
13 http.request(
14 "https://login.xsolla.com/api/oauth2/token",
15 "post",
16 getServerTokenBody,
17 "application/x-www-form-urlencoded",
18 {})
19 );
20
21 let serverToken = ""
22 if ('access_token' in serverTokenResponse) {
23 serverToken = serverTokenResponse.access_token;
24 } else {
25 return {
26 "error_message": "Server token not received"
27 }
28 }
29
30 const getUserTokenHeaders = {
31 "X-Server-Authorization": serverToken
32 }
33
34 const getUserTokenBody = JSON.stringify(
35 {
36 "server_custom_id": currentPlayerId,
37 }
38 );
39
40 const getUserTokenPath =
41 `/api/users/login/server_custom_id?projectId=${loginProjectId}&publisher_project_id=${projectId}`;
42
43 const userTokenResponse = JSON.parse(
44 http.request(
45 `https://login.xsolla.com${getUserTokenPath}`,
46 "post",
47 getUserTokenBody,
48 "application/json",
49 getUserTokenHeaders)
50 );
51
52 if ('token' in userTokenResponse) {
53 return {
54 "token": userTokenResponse.token
55 }
56 } else {
57 return {
58 "error_message": "User token not received"
59 }
60 }
61}
- Перейдите к настройкам проекта в PlayFab.
- Загрузите файл облачного скрипта.
- Запустите облачный скрипт в боевой среде.
- Добавьте клиентскую логику для вызова функции из приложения. Укажите имя функции —
GetXsollaLoginToken
, передача параметров не требуется.
Пример вызова функции получения 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}
Примечание
В примере для выполнения запроса к облачному скрипту используются методы PlayFab SDK. Вы можете реализовать запрос и обработку ответа самостоятельно без добавления PlayFab SDK в проект.
- В приложении реализуйте методы для работы с API самостоятельно или воспользуйтесь Xsolla SDK.
Была ли статья полезна?
Спасибо за обратную связь!
Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.Полезные ссылки
Последнее обновление: 8 октября 2025Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.