Created
July 12, 2024 11:16
-
-
Save PaulAsaf2/14685a185c267eb975194896e3a466eb to your computer and use it in GitHub Desktop.
Валидация initData передаваемая из Telegram Mini App
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const crypto = require('crypto'); // Импортируем встроенный модуль crypto | |
const initData = "ваша строка initData"; // замените на реальные данные, которые вы получили | |
// Парсинг initData | |
const params = new URLSearchParams(initData); // Создаем объект URLSearchParams для парсинга строки initData | |
const parsedData = {}; // Создаем пустой объект для хранения разобранных данных | |
// Проходим по всем записям (парам "ключ-значение") в params и добавляем их в parsedData | |
for (const [key, value] of params.entries()) { | |
parsedData[key] = value; // Сохраняем каждую пару в объекте parsedData | |
} | |
console.log(parsedData); // Выводим разобранные данные для проверки | |
// Извлекаем hash из parsedData | |
const hash = parsedData['hash']; // Сохраняем значение hash в отдельную переменную | |
delete parsedData['hash']; // Удаляем hash из parsedData, чтобы он не участвовал в создании data-check-string | |
// Создаем data-check-string | |
const dataCheckString = Object.keys(parsedData) // Получаем массив ключей из parsedData | |
.sort() // Сортируем ключи в алфавитном порядке | |
.map((key) => `${key}=${parsedData[key]}`) // Создаем строки формата key=value для каждого ключа | |
.join('\n'); // Объединяем строки, используя символ новой строки (\n) | |
console.log('hash:', hash); // Выводим hash для проверки | |
console.log('dataCheckString:', dataCheckString); // Выводим data-check-string для проверки | |
// Замените на ваш токен бота | |
const botToken = 'YOUR_BOT_TOKEN'; // Здесь нужно указать токен вашего бота | |
// Создаем секретный ключ | |
const secretKey = crypto.createHmac('sha256', 'WebAppData') // Создаем объект HMAC с алгоритмом sha256 и ключом "WebAppData" | |
.update(botToken) // Добавляем токен бота к объекту HMAC | |
.digest(); // Завершаем процесс и получаем секретный ключ | |
// Создаем HMAC-SHA-256 подпись для data-check-string | |
const hmac = crypto.createHmac('sha256', secretKey) // Создаем новый объект HMAC с использованием секретного ключа | |
.update(dataCheckString) // Добавляем data-check-string к объекту HMAC | |
.digest('hex'); // Завершаем процесс и получаем итоговую подпись в шестнадцатеричном формате | |
console.log('Generated HMAC:', hmac); // Выводим сгенерированную подпись для проверки | |
// Сравниваем подпись с hash | |
if (hmac === hash) { // Если сгенерированная подпись совпадает с hash | |
console.log('Data is valid'); // Данные валидны | |
// Данные валидны, можно продолжать работу | |
} else { | |
console.log('Data is invalid'); // Данные не валидны | |
// Данные не валидны, обработка ошибки | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Код сгенерирован ИИ.
За основу взята документация по валидации - https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app