nakama/backend/utils/telegram.js

52 lines
1.2 KiB
JavaScript
Raw Normal View History

2025-11-10 22:19:37 +00:00
const { parse, isValid } = require('@telegram-apps/init-data-node');
2025-11-10 21:56:36 +00:00
const config = require('../config');
const MAX_AUTH_AGE_SECONDS = 5 * 60;
2025-11-10 22:19:37 +00:00
function validateAndParseInitData(initDataRaw) {
2025-11-10 21:56:36 +00:00
if (!config.telegramBotToken) {
throw new Error('TELEGRAM_BOT_TOKEN не настроен');
}
2025-11-10 22:19:37 +00:00
if (!initDataRaw || typeof initDataRaw !== 'string') {
throw new Error('initData не передан');
2025-11-10 21:56:36 +00:00
}
2025-11-10 22:19:37 +00:00
const trimmed = initDataRaw.trim();
2025-11-10 21:56:36 +00:00
2025-11-10 22:19:37 +00:00
if (!trimmed.length) {
throw new Error('initData пуст');
2025-11-10 21:56:36 +00:00
}
2025-11-10 22:19:37 +00:00
const valid = isValid(trimmed, config.telegramBotToken);
2025-11-10 21:56:36 +00:00
2025-11-10 22:19:37 +00:00
if (!valid) {
2025-11-10 21:56:36 +00:00
throw new Error('Неверная подпись initData');
}
2025-11-10 22:19:37 +00:00
const payload = parse(trimmed);
2025-11-10 21:56:36 +00:00
2025-11-10 22:19:37 +00:00
if (!payload || !payload.user) {
2025-11-10 21:56:36 +00:00
throw new Error('Отсутствует пользователь в initData');
}
2025-11-10 22:19:37 +00:00
const authDate = Number(payload.auth_date);
if (!authDate) {
throw new Error('Отсутствует auth_date в initData');
2025-11-10 21:56:36 +00:00
}
2025-11-10 22:19:37 +00:00
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - authDate) > MAX_AUTH_AGE_SECONDS) {
throw new Error('Данные авторизации устарели');
2025-11-10 21:56:36 +00:00
}
2025-11-10 22:19:37 +00:00
return payload;
2025-11-10 21:56:36 +00:00
}
module.exports = {
validateAndParseInitData
};