Интеграция с серверной частью
Подпись запроса
к сведению
Все POST запросы содержат HTTP заголовок X-Auth-Signature, необходимый для подтверждения подлинности хоста. Эта операция позволяет отказаться от IP whitelist при интеграции, так как последний лишает возможности провайдера оперативно масштабироваться (горизонтально), не предупреждая при этом партнера.
не пропустите
Тело запроса не должно содержать пробелы и переносы строк.
Подпись запроса сериализуется клиентом в виде Base64-закодированной строки и передается в специальном HTTP-заголовке X-Auth-Signature.
Алгоритм проверки подписи:
- Предварительно между клиентом и сервером определяется секретный ключ в виде UUID (его можно получить у интеграционного менеджера)
- Сервер получает запрос от клиента, вычитывая подпись из HTTP-заголовка X-Auth-Signature.
- Тело запроса и секретный ключ (п.1) являются входными параметрами для функции HMAC-MD5, которая на выходе генерирует последовательность байтов.
- Байтовая последовательность (п.3) сериализуется в виде Base64-закодированной строки.
- Сервер производит сравнение результирующей строки (п.4) со строкой, полученной от клиента (п.2). Если они совпадают, подпись считается валидной.
Пример автоматического формирования подписи для POSTMAN клиента
- Добавьте следующий cURL в Postman(чтобы получить адрес хоста, обратитесь к своему менеджеру по интеграции)
curl --location '$HOST/game/round' \
--header 'Content-Type: application/json' \
--header 'X-Auth-Signature: .... ' \
--header 'Accept: text/html' \
--data '{"cid":"brand-name","playerId":"user-id","productId":"nft-aviatrix","roundId":"123456789","lang":"en"}'
- Добавьте переменную
{{signature}}, как значение для хедераX-Auth-Signature - Добавьте переменную
{{secret}}и присвойте ей значение секретного ключа вашей интеграции используемый для создания подписи - Добавьте следующий скрипт в запрос
const signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacMD5(pm.request.body.toString(), pm.collectionVariables.get("secret")));
pm.collectionVariables.set("signature", signature);
Примеры формирования подписи на Bash
Пустой JSON объект
MESSAGE='{}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> RVBMsFzKbgu9Bs6tSp5jBg==
/playerInfo JSON объект
MESSAGE='{"cid":"somebrand","sessionToken":"some4session7token5","timestamp":1234567890}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> uCYq/GK8ZOYZB5GdNq87Yw==
/bet JSON объект
MESSAGE='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"bonusId":""}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> feQeeyYFxzuRVLLpMQPkZA==
/win JSON объект
MESSAGE='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"operation":"SettleBet","bonusId":""}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> gtk4+Vn4RYBv8A3HxQK4Lw==
/transactions/promoWin JSON объект
MESSAGE='{"cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=","amount":1000,"currency":"EUR","promo":{"type":"bonus","bonusId":"some1bonus2id"}}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> KNJx/uTGu0dn0SikyFF3rQ==
/closeMatch JSON объект
MESSAGE='{"cid":"somebrand","playerId":"someplayerid123","productId":"nft-aviatrix","matchId":"1234567","txId":"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ=="}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"
echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> e114TJ6qfSaSHYTS1CR9AA==
Примеры формирования подписи на Python
Пустой JSON объект
message = '{}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'
signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()
print(encoded_signature)
> RVBMsFzKbgu9Bs6tSp5jBg==
/playerInfo JSON объект
message='{"cid":"somebrand","sessionToken":"some4session7token5","timestamp":1234567890}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'
signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()
print(encoded_signature)
> uCYq/GK8ZOYZB5GdNq87Yw==
/bet JSON объект
message='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"bonusId":""}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'
signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()
print(encoded_signature)
> feQeeyYFxzuRVLLpMQPkZA==