By ZooGamesID

Two-Factor Authentication

Concept

The player provides their ZooGamesID and 2FA token, and if the credentials are valid, the server grants access for the user to log in.

A user's session in the application has an expiration time of 120 minutes. After this period, the session will expire, and the user will need to log in again.

If the user wants to extend the session and prevent it from expiring, they can use the Keep-alive API. By making a request to the Keep-alive API within the session's duration, the session will be refreshed, and the expiration time will be extended.

To gain insights into how authentication works on Zoo.Games, you can explore our open-source Telegram AUTH web app. It will provide you with a clear understanding of the authentication process implemented on the Zoo.Games platform.

pageZooGames AUTH webapp for Telegram

To ensure compatibility with the API, please note that only lowercase ZooGamesIDs are supported. When communicating with the API, please convert any uppercase letters in the ZooGames ID to lowercase. You can maintain the appearance of capital letters in your game, but the actual communication with the API should use lowercase characters.

To authenticate and handle login and logout functionality, you need to follow these steps:

Login and Logout

by installing the SDK and utilizing the signData() function, you can generate the SignedSignatureFromPayload (HMAC signature) for authentication purposes in the ZooGames API requests

Login API - To Login user and return JWT token as a session token

POST API_END_POINT_URL/API_KEY/session/login

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API Key

Headers

NameTypeDescription

authorization*

String

eg: Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

username*

String

ZooGamesId

token*

String

6 digits of 2FA token

{
  "success": true,
  "data": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko"
}
Example of Login
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {username: "myusername", token: "123456"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/login`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

IMPORTANT NOTICE: If a player is authenticated through the PlayPass account, Avoid logging the user out. Such an action can result in the permanent loss of the users linked digital assets.

Logout API - To log out for already log in user

POST API_END_POINT_URL/API_KEY/session/logout

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API Key

Headers

NameTypeDescription

authorization*

String

Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

jwt*

String

JWT token you got from Login API

{
  "success": true
}
Example of Logout
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/logout`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

Keep-alive

The Keep-Alive feature allows users to extend the expiration time of their session. By making a request to the Keep-Alive API endpoint within the session duration, users can refresh the session and prevent it from expiring.

Keep-alive API - To keep alive (Persistent Session) logged in user

POST API_END_POINT_URL/API_KEY/session/keepAlive

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API Key

Headers

NameTypeDescription

authorization*

String

eg: Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

username*

String

ZooGameId

jwt*

String

JWT token you get from Login API

{
  "success": true,
  "data": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko"
}
Example of Keep-alive
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {username: "myusername", jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/keepAlive`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

Keep-Alive helps enhance user experience by reducing the need for repeated logins and provides convenience during extended usage periods.

Approve

Approve API enables the creation of in-game vZOO transactions. However, to ensure security and validate the transaction, players are required to re-enter their 2FA (Two-Factor Authentication) credentials.

If the 2FA validation fails or is not provided by the player, the transaction will not be approved and will result in a failure.

Approve API - To request vZOO spending from user mirror address

POST API_END_POINT_URL/API_KEY/session/approve

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API Key

Headers

NameTypeDescription

authorization*

String

Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

username*

String

ZooGamesId

jwt*

String

JWT token you got from Login API

approval*

Decimal

vZOO amount for approval (e.g. 0.1)

playSeconds*

Integer

approval expiry in (e.g. 3600)

gameAddress

Address

Address of Game/Project registered Primary Address

token*

String

6 digits of 2FA token

{
    "success":true,     
    "data":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lY3Rlc3QiLCJwcmltYXJ5QWRkcmVzcyI6IjB4NUQyQThCMzY4MzI5MjQ0MmZBQ2E1MmU5QjY1MzdGYWFhZDBBRTU3NiIsIm1pcnJvckFkZHJlc3MiOiIweDkxNGUwQ0U0RjQxMzJlQWM4OEMxNDViNkIyOTQ1MTIwNTZCYkZFMzkiLCJtaXJyb3JCYWxhbmNlIjoiNjAuMzUiLCJjaGFpbklkIjo5OTksInZlcmlmeTJGQVN1Y2Nlc3NUaW1lcyI6NCwiY3JlYXRlVGltZSI6MTY1NzA4ODk4MTc5NiwiYXZhdGFyIjoiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvNGdJb1NVTkRYMUJTVDBaSlRFVUFBUUVBQUFJWUFBQUFBQVF3QUFCdGJuUnlVa2RDSUZoWldpQUFBQUFBQUFBQUFBQUFBQUJoWTNOd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUE5dFlBQVFBQUFBRFRMUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbGtaWE5qQUFBQThBQUFBSFJ5V0ZsYUFBQUJaQUFBQUJSbldGbGFBQUFCZUFBQUFCUmlXRmxhQUFBQmpBQUFBQlJ5VkZKREFBQUJvQUFBQUNoblZGSkRBQUFCb0FBQUFDaGlWRkpEQUFBQm9BQUFBQ2gzZEhCMEFBQUJ5QUFBQUJSamNISjBBQUFCM0FBQUFEeHRiSFZqQUFBQUFBQUFBQUVBQUFBTVpXNVZVd0FBQUZnQUFBQWNBSE1BVWdCSEFFSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGaFpXaUFBQUFBQUFBQnZvZ0FBT1BVQUFBT1FXRmxhSUFBQUFBQUFBR0taQUFDM2hRQUFHTnBZV1ZvZ0FBQUFBQUFBSktBQUFBK0VBQUMyejNCaGNtRUFBQUFBQUFRQUFBQUNabVlBQVBLbkFBQU5XUUFBRTlBQUFBcGJBQUFBQUFBQUFBQllXVm9nQUFBQUFBQUE5dFlBQVFBQUFBRFRMVzFzZFdNQUFBQUFBQUFBQVFBQUFBeGxibFZUQUFBQUlBQUFBQndBUndCdkFHOEFad0JzQUdVQUlBQkpBRzRBWXdBdUFDQUFNZ0F3QURFQU52L2JBRU1BQ2djSENBY0dDZ2dJQ0FzS0Nnc09HQkFPRFEwT0hSVVdFUmdqSHlVa0loOGlJU1lyTnk4bUtUUXBJU0l3UVRFME9UcytQajRsTGtSSlF6eElOejArTy8vYkFFTUJDZ3NMRGcwT0hCQVFIRHNvSWlnN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPLy9BQUJFSUFIZ0FlQU1CSWdBQ0VRRURFUUgveEFBY0FBRUFBUVVCQVFBQUFBQUFBQUFBQUFBQUJRRURCQVlIQ0FML3hBQkFFQUFCQXdNQkJBWUZDUWNGQVFBQUFBQUJBQUlEQkFVUkJoSWhNVUVIRXlKUmNaRVVZWUdoc1JVak1qTkNVc0hSOEZOaWNwS2lzdUVXUTBSamdzTC94QUFiQVFBQkJRRUJBQUFBQUFBQUFBQUFBQUFBQVFNRUJRWUNCLy9FQURNUkFBRURBZ0lJQkFVRUF3QUFBQUFBQUFFQUFnTUVFU0V4QlJJeVFWRmhjYkVUd2RId0ZJR1JvZUVHRlROeUlsTHgvOW9BREFNQkFBSVJBeEVBUHdEZDlMNld0K2xyVEZTVWtMT3UyUjE4K3oyNVhjeVQzWjREa3B0RVFoRVJFSVJFUkNFUkVRaEVSZkplMXZGd0hpVWhjR2k1S0Y5SXJScUlXOFpBcXRuaWR3ZUV5S21BbXdlUHFFdGlyaUtpcW4waWlOU2FhdDJwN1ZMUlYwREhQTFQxTTJ6MjRuY2lENDh1YUtYUkNFUkVRaEVSV2FpcWdwWTNTVHl0alkwWkpjY0FMaDcyc0dzNDJDRmVWQ1FCa25BV2hYM3Bjc050TG9xRXV1RXczWWgrai9NZDNsbGFEZE9rblZWOGtNVkk0VU1idURJRzdVaEhqeDhzSmtTeVNZUk1KNW5BZXYyUVNHNHVLN1pjYjdhN1RGMWxkWFEwN2UrUjRibno0clVMajB3NmJwQ1cweG5ySERkODFHY2Vic0xtRUdrcnRjcGZTSzZSd2M3akpVdkxubjJjZk5UZExvYTN4QWRmTkxLZVliaGcvTlNXVUZUSnR2dDB3NzNLZ3lhUnAyWUEzV1hlT21lNDFMU3kwMjl0T1AyazUyajdBTUQ0cldKTDFyYStuTGF1NFN0ZCt4ekczK25BVzN3YWZ0VkZJeDhOR3piSDJua3VQdlV2RndBVlRXR09rbE1lcHJPRzg0OTFvZEgwWXJLZHRRWFdCdmgwTnZKYzEvMHBxeXE3Y3NVcFAvWlVqUHhWZmtqV2RsK2VoYlhSaHUvTlBNWGU1cFhVbUs4M2dvQjBsSmtXZ2pvcHp0R1JESWxhVHBmcGN1VnZxRzAxOUhwTlBuWmRNMXVKR2VzZ2JuZTRydEZEVzA5eG80NnFsa2JKRkswT2E1cHlDRHpYSTljNlpndU5zbHVOTkNHMXRPTnNsZzN5dEhFSHZJRy8ySzcwTWFsSWZOWUoza2dBeXdaUEFaN1RmTWcrMHFkVHpzMUJMSGcyOWlOdzVqaDJzcWlvZ2RDL1ZPUEJkZlJFVnVvcUlpSVF2aVE0aWNmVXZPTit1ZDQxUHFPb29wcXlTVmphbDdJWVM3WlkwQW5HN2h3SEhpdlIwMzFML0JlYjdRTWEwa3p4RlZML0FQU1lZeHI2c2F3eUErNUthbmVZNFhPRzY2bDdkb3FtaEFkV3pHVjMzSSt5M3o0bjNMWktXanBxTm14VFFNaUg3b3huMnJLcDZLb3FjZFZFU1B2SGNGbkdncGFKdTFXVGh6OFpFVFRnbjhWYVBxNmVCd1plN3VBeFB2cXMyMm5yYXhwa2RnM2ljRysrbDFIaGZZVkhPRDNsd1lHQThHdDRCWG1Ra1VjdFcvY3hqY04vZWR3Q215MURLZUx4Sk1CNThFeFMwa2xWT0lZc1NUN1BSWTczQXVBSEpYcGErbXMxcG11ZFZFWmd4d1l5TVl5NXg4VmlRckMxaEZQVTBOdHRsTkUrUjc5cWR6V2poeUhoeldKZTc0NnMxcE1BVGowQS9DOVZraC9iZEhpR0kzSXdITWsrdTVZY3ZTbk1YRVUxcHBnMGZla0orQUMycTExMVJjcmRGV1ZWRzJqa2xHZXFEczd1UjlXZTVhMXAvUmRQUk9aVVZ3YkpJM2UySWIydFBlZTgrNWJnRkVyM1Vvc3lCdVdaeFRkRkhVRC9BRG1PZTcxVnlLTVNTTlllQk8vd1hLZEJuWTZTcVJ0TjlYMTBvR3p3MmRseTMvVnQ2WnA3VGswMjFpcnFtbUtuYnpCSTN1OWczK1MxM29Zc1Q2cTgxRjRrYWVxcG1kVXdubTg4ZklmM0x1ampjS2FRL3dDMkE2bkR6VVRTRWdjOXJSdVhiVVZVV2tWU2lJaUVMNWtHWTNlQlhtbTU3VkJyRzV0YVMxOGRaSTVwQnh1MmorQlhwZHhBYVNUZ1kzcnp4MGlpMzFXdHAyMjBnN0xRS2x6T0JseWRyeFBBZUlVY09MYXRvQXZjSHVFandDdzNVdlVhNnU5NGxGUGJ3eWxhNDdJRVhhY2YvUi9CU3RCUitpUkV5U09sbmZ2bGxjU1M0K0o1S08wOVoyMjZtYkxJekU3MjhQdUR1OGU5VDBNVDU1V3hSakxuRlhOUFR3MHpMdEFieC82c3pYVnN0WEo0WUpJN2xaRkRTT3E1dG5lR04zdmQrQ3hMcGQyMWxWNkZTRUNsZzNFamc5MzVCVjFIZUliVFNpMVVzbUpYNEV6eHhHZVhpZmdvZWhhQXpQZVZVVmhOUkNhbCt6a3dkM0hxTXVBV3QvVDlNSUt0c0RjWEFGenoweWFPaEl2elVwRHdXY3h6bmtPY1NUakdUM0xCaTVMTmk1WkdRc3hJdHpJc21Kcm5rTmFDVDNCVXV0MW9OT1VmcE53a3pJUjgxQTNlNTU5WDU4RkdhajFOVldhbkRMZFFiQWVOOVRKMm10UGRqdjhBRmM0aWRMcVBVRElMbmMyMG5YT3crcHFTVHU3aHlIcTRCUzZiUit1enhwVFpuTEVuNlpkMW5LelNCYTh4TUdQTlpUL2xqcEQxTzJOZ3k1MjRBWjZ1bmp6K3ZFcnZlbkxEUzZkczBGdXBXOW1KdTl4NHVQTW4xa3JHMHBwbTFhY3RyWUxjME9MZ0MrVTczU0h2Si9RVThyV0Jva3RKYXpSc2p6Njl1cXBYRTN4elJFUlRWeWlJb3JVbCtwdE8yV2U0MUx1ekczYzBIZTQ4Z1BXU201SkJHMHVQdmtsQXV0WTZUTmJEVDl1OUFvWkI4b1ZRSVpqL0FHMjhDLzhBTDErQzVwcEt6R1YzeWpVZ3VhSFpadGZiZDk3d0h4VWZUaXQxbHFTYXRySGtoN3R1Vnc0TWJ5YVBnRnYwVWJJbzJ4eHREV01BRFdqZ0FwRkRBUmVSKzBmZGh5SDVWSHBXczFCNExNem43NXE0Rm1WMWRIcHEwbW9mcyttempFVFQ5bjFuMURtcTBiWUtXbmx1ZGE0TXBxY2JXVHpQNjk2NTdmYTZ2MVJYU1RORHcxNTJXc2EwdTJHY2h1OTZXZHhxcGZBYnN0MnVaM045VWFOcHhUeGZFdndjZG5rTjd2UllFZHdrdXQ5Ykk1N25NakxuNVBGeDd6NXJjNlViTEdqdUMxMno2WnJLZWNTR0dRQjJBWFBBYmdlQzIyR2lrSDBuTkhnbTY2Q29sWTFqVzN6UGtGcU5DVnRCVEdTV1dRRElEanZKd3p6c3N5RjFMVDI2b3JLd3VFY1phMEZtOGdrOTNOWkxHQXhzbGplMldGKzlrakRscnYxM0tEMVpPS0RUTlBBWGRxZVYwcDliV2ovSVdwMmZVdDFzUWhsa2pkSERVamFhMlZoNnFjWnhuL0lWSzNSM2lRNjE3UHVjRGxoaGJyY0ZUNXRMbHRTUTBhMGRobHozcnB1dzJSaFk5b2Mxd3dXdUdRVnFlb3RDMDgwTWxWYm5OaUxRWE9oZWV5UU9PRHlVN1p0UTJ5OTdMSVpCVFZSLzQ4cnZwZnd1NS9GU2xiV3cyVzIxTnpxeGhsTzNjMDdpNTNJZTA3bFdzZFUwc3VxTGc4T0treW1tcW90YzRqandYTmRHYTZ1V25hK25vNUtvUHRyM2hybXpra1F0SjNscEdTTWQzQmVnS1dvWlZVekpvM2g3WGdFT2J3SVBNTHoxbyt4eTZ6MWdYVkRBYWRzaHFLclpHRzd6a045cDNlR1Y2SWpqYkZHMk5nQWEwWUFDdjJ0QXFEcVlDMlBDNXkrZkhsWlp2Y3Z0RVJURWlvU0dnazhBdURkTEdwMzNpLzhBeVZDNCtqVUxzT0hKMG5QeTRlYTcwdU45TCtrSkk2Z2FocEdiVWJnR1ZMV2poeUQvQUlBK3hSSnNKV0Yyemo5ZDNtT3FVWkt6WXJXeTFXeU9FWU1qdTNLNGMzSDhBcE1LQjBmZEdYTzNOb2NBVmRLM0FZT01zWTVqMWpnZlllOWJSRGJheVhHekE0RHZkdVZ3eW9oYTI3bkFXNGxZNm9vcXJ4eU5VdUp4dUFUZFdaSkhUd3RnbE8zRTNCREhESUhzVldnTkdHZ0Fkd1VnTExJeHUzVVZFVUxlWkovUEN4SjdocGlneUtxOVJQY09MWTM3UjhtNVRRMG5Sc3dZYi8xQlA0VXh1aUsrU3hlTGYyUHNyNUMrbTd6Z2J5bytiWGVscWI2aWxxS2tqbnNZSDlSL0JSOVIwcU1qeUtPMVF4OXhra3o3Z1B4WFg3bklmNDRUOHlCNnFTelFvSDhrb0hRRStpc2EvcDVmUTZXWXRlQVdQajNnZ2JqdEQ0bnlXK2FPb3JUcXJvN29LV3JwbzVvMlJDSnpYRDZMbTdpZlVkMmNqdlhLYnhyTzU2ampiU1RSeHZZSDdiWTRZZCtmSGVlYTNUb2dkZDdiUFYwZFpicXFHaG0rY2prbGlMV3Rkd0kzOTR4L0txaXRjMTRhK1lBV09WK1BBNFlnbStIQlhFTVlqR28wa2l3eHRiSlJtcWVpbTQyamJxN0U5OVhUQTdYbzdqODR6K0UvYStQaXRPdU9vcnhjcUNLMVZrOGtyWUpPeXg0N2Uxd0FKNG5HL2l2VHBBSXdSa0tBdUdpckxjTDFUWGVTa1lLcW5lSGg0M2JSSERhNzhjUm51U3VFc2U3WEF5NGozOWVxZEhMQzZ3dWpyU3cwMXAyTnN6QUt5bytjblBjVDluMkRkNXJiVlFBQUFEZ0ZWUHd4K0cyeHp6UFgzOWtoUkVST3BFVm1ycFlhMmxrcHFpTnNrY2pTMXpYRElJUEVGWGtYTDJOZTB0ZGtVTHo1cS9SbDAwWmVCWDJ3VEdqYS9iaG5qeVRDZTUzNThDRmlPMW5yRzhucWFhb25jY1lMYVNIQlA4b3l2Umo0MlNERDJodzlhdHgwc0VYMWNMRytBVU13eVhBY0d1dGtUbjI4d25BOHRGZ2JMejVCb1RXdDdlSFQwdFFRZCszVnpZOXhPZmNwK2c2Rkx0S0FhMjZRUWQ3WW1GNTh6aGRwRzdncXAwUnk1Rjl1Z3QzdXVDUVZ6ZWk2RmJIQ1E2cnE2dXBQTWJZYVBjTSs5VDFGMGE2VG9nTm0weFNFYzVzeWYzRXJha1MvRHNPMFNmbWUyU0xyRXBiVlFVVFEybG80WVdqa3hnYjhGbEJyUndBSHNWVVhiSVkyYkxRUGtpNVJFUk9wRVJFUWhFUkVJVVJwclV0djFQYVlhNmltWVh1YU90aDJ1MUU3bTBqang1ODFMb2lFSWlJaENJaUlRaUlpRUlpSWhDSWlJUWlJaUVLTDFEcUczNmJ0VTFmWHpzWnNOSmpqTHUxSzdrMW81NVBseEtJaUVMLy8yUT09IiwiaWF0IjoxNjYxNzg5ODc5LCJhcHByb3ZhbCI6IjAuMSIsInBsYXlTZWNvbmRzIjoiMzYwMCIsInN0YXJ0VGltZSI6MTY2MTc5MDAxNSwiZW5kVGltZSI6MTY2MTc5MzYxNSwiZ2FtZUFkZHJlc3MiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAifQ.TF0AqIniXLg7rEhVOurFnM7MrTTvosXCYpVn0oorgBc"
}
Example of Approve
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {username: "myusername", "token":"123456", jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko","approval":0.1,"playSeconds":3600,"gameAddress": "0xd207d371d7a24F65cE9CcB3C78B58f27DF279Eb2"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/approve`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

Status

The Status API returns the current JWT Payload and verifies whether their JWT is eligible for use in the Settlement API.

Status API - Returns current JWT Payload and verifies current JWT

POST API_END_POINT_URL/API_KEY/session/status

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API Key

Headers

NameTypeDescription

authorization*

String

Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

jwt*

String

JWT token you got from Login API

Query String

NameTypeDescription

without_avatar

Boolean

true: To set "avatar" property as "null" to reduce the returning data

{
    "success":true,
    "data":
        {
            "username":"zoogametester",
            "primaryAddress":"0x8D2A8B3683292442fACa52e9B6537Faaad0AE765",
            "mirrorAddress":"0x524e0CE4F4132eAc88C145b6B294512056BbFE23",
            "mirrorBalance":"55.55",
            "chainId":999,
            "verify2FASuccessTimes":3,
            "createTime":1657088981796,
            "avatar":"data:image/jpeg;base64,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",
            "iat":1660836160,
            "isPlayPass": false,
            "allowance":0
        }
}
Example of Status
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lYyIsInByaW1hcnlBZGRyZXNzIjoiMHg2QWI0OTljOEUyZjNDQmM5Qzk5MDM0YjZlMjkxMjE0OTIxMmJFNzcwIiwibWlycm9yQWRkcmVzcyI6IjB4ZTQyNzQxZjI4ZTE1YzU4NzkxMjlGZTVGNzQ5Zjc4NjIzZWU3MTIzNiIsIm1pcnJvckJhbGFuY2UiOiI1NTUuMSIsImNoYWluSWQiOiI4ODgiLCJ2ZXJpZnkyRkFTdWNjZXNzVGltZXMiOjQsImlhdCI6MTY1NjMxMTc4MH0.4EzwI54lVs_9zx2Qy-UhDsVb5PocHIDjxK0cCIxEZko"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/status`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

Login and Approve

When users interact with the Login and Approve API, they are required to provide their login credentials, ZooGamesID and 2FA, to authenticate themselves and gain access to their account. Upon successful authentication, users can proceed to approve in-game transactions.

If the 2FA validation fails or is not provided by the player, the transaction will not be approved and will result in a failure.

Login and Approve API - to Login and Approve at once

POST API_END_POINT_URL/API_KEY/session/loginAndApprove

SDK Preparation

You need to prepare for SignedSignatureFromPayload by

Installing zoo-game-sdk by npm install zoo-game-sdk

Import SDK by import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'

Signing by SDK

let bodyMessage =JSON.stringify(payload);

let hmac = ApiKey.signData(bodyMessage, SEC_KEY);

*Use "hmac" as SignedSignatureFromPayload

Path Parameters

NameTypeDescription

API_KEY*

String

API KEY

Headers

NameTypeDescription

authorization*

String

Bearer SignedSignatureFromPayload

Request Body

NameTypeDescription

username*

String

ZooGamesId

token*

String

6 digits of 2FA token

approval*

Decimal

vZOO amount for approval (e.g. 0.1)

playSeconds*

Integer

approval expiry in (e.g. 3600)

gameAddress*

Address

Address of Game/Project registered Primary Address

{
    "success":true,     
    "data":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNyeXB0b2Zlbm5lY3Rlc3QiLCJwcmltYXJ5QWRkcmVzcyI6IjB4NUQyQThCMzY4MzI5MjQ0MmZBQ2E1MmU5QjY1MzdGYWFhZDBBRTU3NiIsIm1pcnJvckFkZHJlc3MiOiIweDkxNGUwQ0U0RjQxMzJlQWM4OEMxNDViNkIyOTQ1MTIwNTZCYkZFMzkiLCJtaXJyb3JCYWxhbmNlIjoiNjAuMzUiLCJjaGFpbklkIjo5OTksInZlcmlmeTJGQVN1Y2Nlc3NUaW1lcyI6NCwiY3JlYXRlVGltZSI6MTY1NzA4ODk4MTc5NiwiYXZhdGFyIjoiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvNGdJb1NVTkRYMUJTVDBaSlRFVUFBUUVBQUFJWUFBQUFBQVF3QUFCdGJuUnlVa2RDSUZoWldpQUFBQUFBQUFBQUFBQUFBQUJoWTNOd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUE5dFlBQVFBQUFBRFRMUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbGtaWE5qQUFBQThBQUFBSFJ5V0ZsYUFBQUJaQUFBQUJSbldGbGFBQUFCZUFBQUFCUmlXRmxhQUFBQmpBQUFBQlJ5VkZKREFBQUJvQUFBQUNoblZGSkRBQUFCb0FBQUFDaGlWRkpEQUFBQm9BQUFBQ2gzZEhCMEFBQUJ5QUFBQUJSamNISjBBQUFCM0FBQUFEeHRiSFZqQUFBQUFBQUFBQUVBQUFBTVpXNVZVd0FBQUZnQUFBQWNBSE1BVWdCSEFFSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGaFpXaUFBQUFBQUFBQnZvZ0FBT1BVQUFBT1FXRmxhSUFBQUFBQUFBR0taQUFDM2hRQUFHTnBZV1ZvZ0FBQUFBQUFBSktBQUFBK0VBQUMyejNCaGNtRUFBQUFBQUFRQUFBQUNabVlBQVBLbkFBQU5XUUFBRTlBQUFBcGJBQUFBQUFBQUFBQllXVm9nQUFBQUFBQUE5dFlBQVFBQUFBRFRMVzFzZFdNQUFBQUFBQUFBQVFBQUFBeGxibFZUQUFBQUlBQUFBQndBUndCdkFHOEFad0JzQUdVQUlBQkpBRzRBWXdBdUFDQUFNZ0F3QURFQU52L2JBRU1BQ2djSENBY0dDZ2dJQ0FzS0Nnc09HQkFPRFEwT0hSVVdFUmdqSHlVa0loOGlJU1lyTnk4bUtUUXBJU0l3UVRFME9UcytQajRsTGtSSlF6eElOejArTy8vYkFFTUJDZ3NMRGcwT0hCQVFIRHNvSWlnN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPLy9BQUJFSUFIZ0FlQU1CSWdBQ0VRRURFUUgveEFBY0FBRUFBUVVCQVFBQUFBQUFBQUFBQUFBQUJRRURCQVlIQ0FML3hBQkFFQUFCQXdNQkJBWUZDUWNGQVFBQUFBQUJBQUlEQkFVUkJoSWhNVUVIRXlKUmNaRVVZWUdoc1JVak1qTkNVc0hSOEZOaWNwS2lzdUVXUTBSamdzTC94QUFiQVFBQkJRRUJBQUFBQUFBQUFBQUFBQUFBQVFNRUJRWUNCLy9FQURNUkFBRURBZ0lJQkFVRUF3QUFBQUFBQUFFQUFnTUVFU0V4QlJJeVFWRmhjYkVUd2RId0ZJR1JvZUVHRlROeUlsTHgvOW9BREFNQkFBSVJBeEVBUHdEZDlMNld0K2xyVEZTVWtMT3UyUjE4K3oyNVhjeVQzWjREa3B0RVFoRVJFSVJFUkNFUkVRaEVSZkplMXZGd0hpVWhjR2k1S0Y5SXJScUlXOFpBcXRuaWR3ZUV5S21BbXdlUHFFdGlyaUtpcW4waWlOU2FhdDJwN1ZMUlYwREhQTFQxTTJ6MjRuY2lENDh1YUtYUkNFUkVRaEVSV2FpcWdwWTNTVHl0alkwWkpjY0FMaDcyc0dzNDJDRmVWQ1FCa25BV2hYM3Bjc050TG9xRXV1RXczWWgrai9NZDNsbGFEZE9rblZWOGtNVkk0VU1idURJRzdVaEhqeDhzSmtTeVNZUk1KNW5BZXYyUVNHNHVLN1pjYjdhN1RGMWxkWFEwN2UrUjRibno0clVMajB3NmJwQ1cweG5ySERkODFHY2Vic0xtRUdrcnRjcGZTSzZSd2M3akpVdkxubjJjZk5UZExvYTN4QWRmTkxLZVliaGcvTlNXVUZUSnR2dDB3NzNLZ3lhUnAyWUEzV1hlT21lNDFMU3kwMjl0T1AyazUyajdBTUQ0cldKTDFyYStuTGF1NFN0ZCt4ekczK25BVzN3YWZ0VkZJeDhOR3piSDJua3VQdlV2RndBVlRXR09rbE1lcHJPRzg0OTFvZEgwWXJLZHRRWFdCdmgwTnZKYzEvMHBxeXE3Y3NVcFAvWlVqUHhWZmtqV2RsK2VoYlhSaHUvTlBNWGU1cFhVbUs4M2dvQjBsSmtXZ2pvcHp0R1JESWxhVHBmcGN1VnZxRzAxOUhwTlBuWmRNMXVKR2VzZ2JuZTRydEZEVzA5eG80NnFsa2JKRkswT2E1cHlDRHpYSTljNlpndU5zbHVOTkNHMXRPTnNsZzN5dEhFSHZJRy8ySzcwTWFsSWZOWUoza2dBeXdaUEFaN1RmTWcrMHFkVHpzMUJMSGcyOWlOdzVqaDJzcWlvZ2RDL1ZPUEJkZlJFVnVvcUlpSVF2aVE0aWNmVXZPTit1ZDQxUHFPb29wcXlTVmphbDdJWVM3WlkwQW5HN2h3SEhpdlIwMzFML0JlYjdRTWEwa3p4RlZML0FQU1lZeHI2c2F3eUErNUthbmVZNFhPRzY2bDdkb3FtaEFkV3pHVjMzSSt5M3o0bjNMWktXanBxTm14VFFNaUg3b3huMnJLcDZLb3FjZFZFU1B2SGNGbkdncGFKdTFXVGh6OFpFVFRnbjhWYVBxNmVCd1plN3VBeFB2cXMyMm5yYXhwa2RnM2ljRysrbDFIaGZZVkhPRDNsd1lHQThHdDRCWG1Ra1VjdFcvY3hqY04vZWR3Q215MURLZUx4Sk1CNThFeFMwa2xWT0lZc1NUN1BSWTczQXVBSEpYcGErbXMxcG11ZFZFWmd4d1l5TVl5NXg4VmlRckMxaEZQVTBOdHRsTkUrUjc5cWR6V2poeUhoeldKZTc0NnMxcE1BVGowQS9DOVZraC9iZEhpR0kzSXdITWsrdTVZY3ZTbk1YRVUxcHBnMGZla0orQUMycTExMVJjcmRGV1ZWRzJqa2xHZXFEczd1UjlXZTVhMXAvUmRQUk9aVVZ3YkpJM2UySWIydFBlZTgrNWJnRkVyM1Vvc3lCdVdaeFRkRkhVRC9BRG1PZTcxVnlLTVNTTlllQk8vd1hLZEJuWTZTcVJ0TjlYMTBvR3p3MmRseTMvVnQ2WnA3VGswMjFpcnFtbUtuYnpCSTN1OWczK1MxM29Zc1Q2cTgxRjRrYWVxcG1kVXdubTg4ZklmM0x1ampjS2FRL3dDMkE2bkR6VVRTRWdjOXJSdVhiVVZVV2tWU2lJaUVMNWtHWTNlQlhtbTU3VkJyRzV0YVMxOGRaSTVwQnh1MmorQlhwZHhBYVNUZ1kzcnp4MGlpMzFXdHAyMjBnN0xRS2x6T0JseWRyeFBBZUlVY09MYXRvQXZjSHVFandDdzNVdlVhNnU5NGxGUGJ3eWxhNDdJRVhhY2YvUi9CU3RCUitpUkV5U09sbmZ2bGxjU1M0K0o1S08wOVoyMjZtYkxJekU3MjhQdUR1OGU5VDBNVDU1V3hSakxuRlhOUFR3MHpMdEFieC82c3pYVnN0WEo0WUpJN2xaRkRTT3E1dG5lR04zdmQrQ3hMcGQyMWxWNkZTRUNsZzNFamc5MzVCVjFIZUliVFNpMVVzbUpYNEV6eHhHZVhpZmdvZWhhQXpQZVZVVmhOUkNhbCt6a3dkM0hxTXVBV3QvVDlNSUt0c0RjWEFGenoweWFPaEl2elVwRHdXY3h6bmtPY1NUakdUM0xCaTVMTmk1WkdRc3hJdHpJc21Kcm5rTmFDVDNCVXV0MW9OT1VmcE53a3pJUjgxQTNlNTU5WDU4RkdhajFOVldhbkRMZFFiQWVOOVRKMm10UGRqdjhBRmM0aWRMcVBVRElMbmMyMG5YT3crcHFTVHU3aHlIcTRCUzZiUit1enhwVFpuTEVuNlpkMW5LelNCYTh4TUdQTlpUL2xqcEQxTzJOZ3k1MjRBWjZ1bmp6K3ZFcnZlbkxEUzZkczBGdXBXOW1KdTl4NHVQTW4xa3JHMHBwbTFhY3RyWUxjME9MZ0MrVTczU0h2Si9RVThyV0Jva3RKYXpSc2p6Njl1cXBYRTN4elJFUlRWeWlJb3JVbCtwdE8yV2U0MUx1ekczYzBIZTQ4Z1BXU201SkJHMHVQdmtsQXV0WTZUTmJEVDl1OUFvWkI4b1ZRSVpqL0FHMjhDLzhBTDErQzVwcEt6R1YzeWpVZ3VhSFpadGZiZDk3d0h4VWZUaXQxbHFTYXRySGtoN3R1Vnc0TWJ5YVBnRnYwVWJJbzJ4eHREV01BRFdqZ0FwRkRBUmVSKzBmZGh5SDVWSHBXczFCNExNem43NXE0Rm1WMWRIcHEwbW9mcyttempFVFQ5bjFuMURtcTBiWUtXbmx1ZGE0TXBxY2JXVHpQNjk2NTdmYTZ2MVJYU1RORHcxNTJXc2EwdTJHY2h1OTZXZHhxcGZBYnN0MnVaM045VWFOcHhUeGZFdndjZG5rTjd2UllFZHdrdXQ5Ykk1N25NakxuNVBGeDd6NXJjNlViTEdqdUMxMno2WnJLZWNTR0dRQjJBWFBBYmdlQzIyR2lrSDBuTkhnbTY2Q29sWTFqVzN6UGtGcU5DVnRCVEdTV1dRRElEanZKd3p6c3N5RjFMVDI2b3JLd3VFY1phMEZtOGdrOTNOWkxHQXhzbGplMldGKzlrakRscnYxM0tEMVpPS0RUTlBBWGRxZVYwcDliV2ovSVdwMmZVdDFzUWhsa2pkSERVamFhMlZoNnFjWnhuL0lWSzNSM2lRNjE3UHVjRGxoaGJyY0ZUNXRMbHRTUTBhMGRobHozcnB1dzJSaFk5b2Mxd3dXdUdRVnFlb3RDMDgwTWxWYm5OaUxRWE9oZWV5UU9PRHlVN1p0UTJ5OTdMSVpCVFZSLzQ4cnZwZnd1NS9GU2xiV3cyVzIxTnpxeGhsTzNjMDdpNTNJZTA3bFdzZFUwc3VxTGc4T0treW1tcW90YzRqandYTmRHYTZ1V25hK25vNUtvUHRyM2hybXpra1F0SjNscEdTTWQzQmVnS1dvWlZVekpvM2g3WGdFT2J3SVBNTHoxbyt4eTZ6MWdYVkRBYWRzaHFLclpHRzd6a045cDNlR1Y2SWpqYkZHMk5nQWEwWUFDdjJ0QXFEcVlDMlBDNXkrZkhsWlp2Y3Z0RVJURWlvU0dnazhBdURkTEdwMzNpLzhBeVZDNCtqVUxzT0hKMG5QeTRlYTcwdU45TCtrSkk2Z2FocEdiVWJnR1ZMV2poeUQvQUlBK3hSSnNKV0Yyemo5ZDNtT3FVWkt6WXJXeTFXeU9FWU1qdTNLNGMzSDhBcE1LQjBmZEdYTzNOb2NBVmRLM0FZT01zWTVqMWpnZlllOWJSRGJheVhHekE0RHZkdVZ3eW9oYTI3bkFXNGxZNm9vcXJ4eU5VdUp4dUFUZFdaSkhUd3RnbE8zRTNCREhESUhzVldnTkdHZ0Fkd1VnTExJeHUzVVZFVUxlWkovUEN4SjdocGlneUtxOVJQY09MWTM3UjhtNVRRMG5Sc3dZYi8xQlA0VXh1aUsrU3hlTGYyUHNyNUMrbTd6Z2J5bytiWGVscWI2aWxxS2tqbnNZSDlSL0JSOVIwcU1qeUtPMVF4OXhra3o3Z1B4WFg3bklmNDRUOHlCNnFTelFvSDhrb0hRRStpc2EvcDVmUTZXWXRlQVdQajNnZ2JqdEQ0bnlXK2FPb3JUcXJvN29LV3JwbzVvMlJDSnpYRDZMbTdpZlVkMmNqdlhLYnhyTzU2ampiU1RSeHZZSDdiWTRZZCtmSGVlYTNUb2dkZDdiUFYwZFpicXFHaG0rY2prbGlMV3Rkd0kzOTR4L0txaXRjMTRhK1lBV09WK1BBNFlnbStIQlhFTVlqR28wa2l3eHRiSlJtcWVpbTQyamJxN0U5OVhUQTdYbzdqODR6K0UvYStQaXRPdU9vcnhjcUNLMVZrOGtyWUpPeXg0N2Uxd0FKNG5HL2l2VHBBSXdSa0tBdUdpckxjTDFUWGVTa1lLcW5lSGg0M2JSSERhNzhjUm51U3VFc2U3WEF5NGozOWVxZEhMQzZ3dWpyU3cwMXAyTnN6QUt5bytjblBjVDluMkRkNXJiVlFBQUFEZ0ZWUHd4K0cyeHp6UFgzOWtoUkVST3BFVm1ycFlhMmxrcHFpTnNrY2pTMXpYRElJUEVGWGtYTDJOZTB0ZGtVTHo1cS9SbDAwWmVCWDJ3VEdqYS9iaG5qeVRDZTUzNThDRmlPMW5yRzhucWFhb25jY1lMYVNIQlA4b3l2Umo0MlNERDJodzlhdHgwc0VYMWNMRytBVU13eVhBY0d1dGtUbjI4d25BOHRGZ2JMejVCb1RXdDdlSFQwdFFRZCszVnpZOXhPZmNwK2c2Rkx0S0FhMjZRUWQ3WW1GNTh6aGRwRzdncXAwUnk1Rjl1Z3QzdXVDUVZ6ZWk2RmJIQ1E2cnE2dXBQTWJZYVBjTSs5VDFGMGE2VG9nTm0weFNFYzVzeWYzRXJha1MvRHNPMFNmbWUyU0xyRXBiVlFVVFEybG80WVdqa3hnYjhGbEJyUndBSHNWVVhiSVkyYkxRUGtpNVJFUk9wRVJFUWhFUkVJVVJwclV0djFQYVlhNmltWVh1YU90aDJ1MUU3bTBqang1ODFMb2lFSWlJaENJaUlRaUlpRUlpSWhDSWlJUWlJaUVLTDFEcUczNmJ0VTFmWHpzWnNOSmpqTHUxSzdrMW81NVBseEtJaUVMLy8yUT09IiwiaWF0IjoxNjYxNzg5ODc5LCJhcHByb3ZhbCI6IjAuMSIsInBsYXlTZWNvbmRzIjoiMzYwMCIsInN0YXJ0VGltZSI6MTY2MTc5MDAxNSwiZW5kVGltZSI6MTY2MTc5MzYxNSwiZ2FtZUFkZHJlc3MiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAifQ.TF0AqIniXLg7rEhVOurFnM7MrTTvosXCYpVn0oorgBc"
}
Example of Login and Approve
import * as ApiKey from 'zoo-game-sdk/src/auth/apikey/index'
import axios from 'axios';

// Initialized API KEY and SECRET KEY
const API_KEY = 'YourApiKey';
const SEC_KEY = 'YourSecretKey';

// Signing body data with HMAC signing
let body = {username: "myusername", "token":"123456", "approval":0.1, "playSeconds":3600, "gameAddress": "0xd207d371d7a24F65cE9CcB3C78B58f27DF279Eb2"};
let bodyMessage = JSON.stringify(body); 
let hmac = ApiKey.signData(bodyMessage, SEC_KEY); // hmac or SignedSignatureFromPayload  

// Request by Post Method //
let ret = await axios.post(`/api/${API_KEY}/session/loginAndApprove`, body, {headers:{Authorization: `Bearer ${hmac}`}});
console.log('ret', ret.data);

Last updated