Skip to content

Instantly share code, notes, and snippets.

@PaulAsaf2
Created July 12, 2024 11:16
Show Gist options
  • Save PaulAsaf2/14685a185c267eb975194896e3a466eb to your computer and use it in GitHub Desktop.
Save PaulAsaf2/14685a185c267eb975194896e3a466eb to your computer and use it in GitHub Desktop.
Валидация initData передаваемая из Telegram Mini App
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'); // Данные не валидны
// Данные не валидны, обработка ошибки
}
@PaulAsaf2
Copy link
Author

Код сгенерирован ИИ.
За основу взята документация по валидации - https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment