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