Не работает авторизация 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):
......