Привет всем! Пытаюсь реализовать проверку данных из Web App Телеграмма (
https://core.telegram.org/bots/webapps#validating-... ) в моем приложении на NestJS . Ключи не сходятся у меня никак. Я не могу понять это из-за использования рабочего впн ( без него не проверить. Работа формы, которая открывается, подвязана под впн) или из -за ошибки в моем коде. Буду рад любому совету! Ниже код как я выполняю проверку
async authorizationTest(@Body() authorizationData: AuthorizeUserDto) {
console.log("Body received from Telegram", authorizationData);
const botToken = this.configService.get("TELEGRAM_BOT_TOKEN");
const data = querystring.parse(authorizationData.telegramId);
console.log("Data before hash", data);
const hash = data.hash as string;
delete data.hash; // Remove hash from object to build the verification string
// 2. Building the verification string.
const dataCheckString = Object.keys(data)
.sort()
.map((key) => `${key}=${data[key]}`)
.join("\n");
console.log("dataCheckString", dataCheckString);
// 3. Calculating the secret key.
const secretKey = crypto
.createHmac("sha256", botToken)
.update("WebAppData")
.digest();
console.log("secretKey", secretKey);
// 4. Computing HMAC for the verification string.
const computedHash = crypto
.createHmac("sha256", secretKey)
.update(dataCheckString)
.digest("hex");
console.log("computedHash", computedHash);
// 5. Comparing the computed HMAC with hash.
if (computedHash !== hash) {
console.log("Verification failed!");
} else {
console.log("Hooray! Verification succeeded!");
// 6. Checking the auth_date for its validity.
const CURRENT_UNIX_TIME = Math.floor(Date.now() / 1000);
const TIMEOUT_SECONDS = 3600; // Approximately 1 hour
if (CURRENT_UNIX_TIME - Number(data.auth_date) > TIMEOUT_SECONDS) {
console.log("Verification failed due to timeout");
}
// If all checks are successful, return true.
console.log("Verification successful");
}
}