Не удается заставить Telegram WebApp Validation работать с помощью python
Я не могу подтвердить данные, которые Telegram отправил в мое WebApp.
import hashlib
import hmac
import json
import typing
from urllib.parse import unquote
def parse_init_data(init_data: str) -> typing.Dict:
return dict(param.split("=") for param in init_data.split("&"))
def parse_user_data(user_data: str) -> dict:
return json.loads(unquote(user_data))
def _extract_hash_value(init_data: str) -> str:
return parse_init_data(init_data)["hash"]
def generate_secret_key(telegram_bot_token: str, c_str: str = "WebAppData") -> str:
c_str_enc = c_str.encode()
token_enc = telegram_bot_token.encode()
return hmac.new(token_enc, c_str_enc, digestmod=hashlib.sha256).hexdigest()
def validate(init_data: str, secret_key: str) -> bool:
hash_ = _extract_hash_value(init_data)
unquote_init_data = unquote(init_data)
sorted_init_data = sorted(
[chunk.split("=") for chunk in unquote_init_data.split("&") if chunk[: len("hash=")] != "hash="],
key=lambda x: x[0],
)
sorted_init_data_str = "\n".join([f"{key}={val}" for key, val in sorted_init_data])
init_data_enc = sorted_init_data_str.encode()
secret_key_enc = secret_key.encode()
data_check = hmac.new(init_data_enc, secret_key_enc, digestmod=hashlib.sha256).hexdigest()
return hmac.compare_digest(hash_, data_check)
Этот код взят с github. Он предназначен для проверки данных, поступающих из Telegram в мой WebApp. Я прошел все необходимые вещи... извлечение данных пользователя из отправленных данных Telegram работает. Но валидация данных из Telegram не работает. Вот initData, которую я получил
query_id=AAHkHFkqAAAAAOQcWSqv8eyu&user=%7B%22id%22%3A710483172%2C%22first_name%22%3A%22Ro%27zmat%22%2C%22last_name%22%3A%22Otajonov%22%2C%22username%22%3A%22OtajonovR%22%2C%22language_code%22%3A%22en%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%7D&auth_date=1713215281&hash=c7907965154661f6f322d02e4a97086568e033980818396b623649ba3a062685
а этот код - мое представление в django, которое пытается подтвердить, используя вышеуказанные функции:
from django.shortcuts import render
from .webapp_auth import parse_init_data, parse_user_data, validate, generate_secret_key
from django.contrib.auth import get_user_model
User = get_user_model()
def business_settings_view(request):
if request.method == 'POST':
init_data_string = request.POST.get('initData')
secret_key = generate_secret_key("6194107681:AAFc76vwjlxsWA...")
db_user = None
tg_user = None
init_data = None
is_valid = False
if validate(init_data_string, secret_key):
is_valid = True
init_data = parse_init_data(init_data_string)
tg_user = parse_user_data(init_data['user'])
try:
db_user = User.objects.get(telegram_id=tg_user['id'])
except User.DoesNotExist:
db_user = None
context = {'db_user': db_user, 'init_data': init_data, 'is_valid': is_valid}
return render(request, 'business-settings.html', context)
else:
return render(request, 'webapp-init.html')
Я пытался использовать все, кроме validate(). все работает нормально. Но validate() все время возвращает False