Не работает авторизация Python Flask с Telegram login widget

Пытаюсь реализовать авторизацию на сайте через widget Telegram login

Вроде делаю все правильно, но хэши при авторизации не совпадают.

Мой код:

def check_string(d, token):
    secret = hashlib.sha256()
    secret.update(token.encode('utf-8'))
    sorted_params = collections.OrderedDict(sorted(d.items()))
    param_hash = sorted_params.pop('hash')
    msg = "\n".join(["{}={}".format(k, v) for k, v in sorted_params.items()])
    print(f" msg - {msg} ")
    if param_hash == hmac.new(secret.digest(), msg.encode('utf-8'), digestmod=hashlib.sha256).hexdigest():
        return True
    return False


@auth.route('/tglogin')
def logintg():
    tg_data = {
        "id": request.args.get('id', None),
        "first_name": request.args.get('first_name', None),
        "last_name": request.args.get('last_name', None),
        "username": request.args.get('username', None),
        "auth_date": request.args.get('auth_date', None),
        "hash": request.args.get('hash', None),
        "photo_url": request.args.get('photo_url', None)
    }

    result = check_string(tg_data, '1883997977:AAFC1pKQ8jHSYkkBfW09jupQZtAhpmUoLIA')
    return f"result - {result}"

возможно у кого-то есть рабочее решение? Спасибо


Ответы (1 шт):

Автор решения: Valeriy

Рабочий код для авторизации python flask

def string_generator(data_incoming):
    data = data_incoming.copy()
    del data['hash']
    keys = sorted(data.keys())
    string_arr = []
    for key in keys:
        if data[key] != None:
            string_arr.append(key+'='+data[key])
    string_cat = '\n'.join(string_arr)
    return string_cat

def data_check(BOT_TOKEN, tg_data):
    data_check_string = string_generator(tg_data)
    secret_key = hashlib.sha256(BOT_TOKEN.encode('utf-8')).digest()
    secret_key_bytes = secret_key
    data_check_string_bytes = bytes(data_check_string,'utf-8')
    hmac_string = hmac.new(secret_key_bytes, data_check_string_bytes, hashlib.sha256).hexdigest()
    if hmac_string == tg_data['hash']:
        return True
    else:
        return False

   @auth.route('/tglogin')
def logintg():
    BOT_TOKEN = 'Ваш токен'

    tg_data = {
        "id": request.args.get('id', None),
        "first_name": request.args.get('first_name', None),
        "last_name": request.args.get('last_name', None),
        "username": request.args.get('username', None),
        "photo_url": request.args.get('photo_url', None),
        "auth_date": request.args.get('auth_date', None),
        "hash": request.args.get('hash', None)
    }
if data_check(BOT_TOKEN, tg_data):
......
→ Ссылка