Авторизация через Telegram ID и номер телефона
Авторизация через Telegram ID и номер телефона
Описание
Реализована схема авторизации, которая позволяет пользователям сайта войти через Telegram ID и номер телефона.
Для этого используется общий секретный ключ между ботом и сайтом.Пользователь получает уникальную ссылку от бота с параметром
data, в котором зашифрован Telegram ID и временная метка создания. При переходе по ссылке на сайт происходит проверка подлинности данных. Далее пользователь вводит номер телефона, после чего сайт связывает Telegram ID с номером и передает данные в сервис для дальнейшей работы.
Как работает
Генерация ссылки в боте
Бот формирует строку для кодирования:string_to_encrypt_bytes = '{"telegram_id": "123456", "timestamp": "1756977183"}'.encode('utf-8')Затем генерирует случайный nonce (вектор инициализации) размером 12 байт и шифрует эти данные с помощью алгоритма AES в режиме GCM с использованием ключа длиной 32 байта:
nonce = random_bytes(12) encrypted_data = AES_GCM_Encrypt(key, nonce, string_to_encrypt_bytes) result = nonce + encrypted_data output = base64_urlsafe_encode(result)В итоговую ссылку вставляется этот параметр:
https://mascotte.ru/tg-auth/?data=[data]Обработка запроса на сайте
- Извлекается параметр
data;- Выделяет первые 12 байт как nonce;
- Остальные байты как зашифрованный текст с тегом;
- Сайт расшифровывает данные используя секретный ключ и проверяет:
- что временная метка не старше 10 минут!
- что данные корректно расшифровались!
- Если проверка успешна — пользователь видит форму для ввода номера телефона.
Авторизация пользователя
Пользователь вводит номер телефона и проходит обычную авторизацию на сайте.
После успешной авторизации сайт формирует JSON объект:{ "telegram_id": "123456", "phone_number": "+79995556644" }Этот объект отправляется в сервис (боту) для связывания данных.
Важные моменты
Формат JSON для связки данных
{ "telegram_id": "123456", "phone_number": "+79995556644" }
Пример последовательности
- Пользователь получает ссылку:
https://mascotte.ru/tg-auth/?data=abcdef123456...
- Переходит по ней, подтверждает время и номер телефона.
- Сайт связывает телефон и Telegram ID, отправляет данные в сервис.