无法验证通过小程序收到的数据

问题描述 投票:0回答:1

我在我的电报迷你应用程序中使用此方法时遇到问题: https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app

当客户端尝试登录我的迷你应用程序前端时发送检查字符串(如文章中所示)时,我在后端生成哈希字符串以使用此函数检查客户端登录

import json
import urllib.parse
import hmac
import hashlib

def verify_telegram_webapp_data(telegram_init_data: str, bot_token: str) -> bool:
    init_data = json.loads(urllib.parse.unquote(telegram_init_data))
    if "hash" not in init_data:
        return False

    hash_ = init_data.pop('hash')

    data_to_check_parts = []
    for key, value in sorted(init_data.items()):
        if isinstance(value, dict):
            value = json.dumps(value, separators=(',', ':'), ensure_ascii=False)
        data_to_check_parts.append(f"{key}={value}")
    
    data_to_check = "\n".join(data_to_check_parts)

    secret_key = hmac.new(bot_token.encode(), 'WebAppData'.encode(), hashlib.sha256).digest()
    computed_hash = hmac.new(data_to_check.encode(), secret_key, hashlib.sha256).hexdigest()

    print('Data to check:', data_to_check)
    print('Computed hash:', computed_hash)
    print('Provided hash:', hash_)
    
    return computed_hash == hash_

在 telegram 将 photo_url 添加到其数据中之前 - 这段代码工作正常,但现在不起作用 - 假设哈希值和计算的哈希值不同

我尝试过更改photo_url、删除它,但结果是一样的...

python telegram-bot telegram-api
1个回答
0
投票

我遇到了同样的问题,这是我的 JS 代码:

 const verifyDataIntegrity = (object, { key, hash }) => {
    // Проверяем, что object является объектом, и что key и hash не пустые
    if (typeof object !== "object" || object === null || !key || !hash)
        throw new Error("Invalid arguments for data integrity verification");

    // Сортируем ключи объекта и преобразуем его в строку в формате ключ=значение, разделенные символом новой строки
    const dataCheckString = Object.entries(object).sort().map(([k, v]) => {
        // Если значение является объектом, преобразуем его в строку JSON
        if (typeof v === "object" && v !== null) {
            v = JSON.stringify(v);
        }

        // Возвращаем строку в формате ключ=значение
        return `${k}=${v}`;
    }).join("\n");

    // Создаем хеш из строки для проверки
    const calculatedHash = crypto.createHmac("sha256", key).update(dataCheckString).digest("hex");

    // Сравниваем полученный хеш с хешем из данных
    return cryptoUtils.timingSafeEqual(calculatedHash, hash);
};
© www.soinside.com 2019 - 2024. All rights reserved.