我在我的电报迷你应用程序中使用此方法时遇到问题: 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、删除它,但结果是一样的...
我遇到了同样的问题,这是我的 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);
};