@timofeus91
Junior Frontend Developer

Как правильно проверить данные в Web App Телеграма?

Привет всем! Пытаюсь реализовать проверку данных из 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");
    }
}
  • Вопрос задан
  • 768 просмотров
Решения вопроса 1
@timofeus91 Автор вопроса
Junior Frontend Developer
Ошибся в создании ключа -
const secretKey = crypto
  .createHmac("sha256", "WebAppData")
  .update(botToken)
  .digest();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы