Авторизация через Telegram ID и номер телефона

🧩 Syntax:

Авторизация через Telegram ID и номер телефона

Описание

Реализована схема авторизации, которая позволяет пользователям сайта войти через Telegram ID и номер телефона.
Для этого используется общий секретный ключ между ботом и сайтом.

Пользователь получает уникальную ссылку от бота с параметром data, в котором зашифрован Telegram ID и временная метка создания. При переходе по ссылке на сайт происходит проверка подлинности данных. Далее пользователь вводит номер телефона, после чего сайт связывает Telegram ID с номером и передает данные в сервис для дальнейшей работы.


Как работает

  1. Генерация ссылки в боте
    Бот формирует строку для кодирования:

    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]
    
  2. Обработка запроса на сайте

    • Извлекается параметр data;
    • Выделяет первые 12 байт как nonce;
    • Остальные байты как зашифрованный текст с тегом;
    • Сайт расшифровывает данные используя секретный ключ и проверяет:
      • что временная метка не старше 10 минут!
      • что данные корректно расшифровались!
    • Если проверка успешна — пользователь видит форму для ввода номера телефона.
  3. Авторизация пользователя
    Пользователь вводит номер телефона и проходит обычную авторизацию на сайте.
    После успешной авторизации сайт формирует JSON объект:

    {
      "telegram_id": "123456",
      "phone_number": "+79995556644"
    }
    

    Этот объект отправляется в сервис (боту) для связывания данных.


Важные моменты


Формат JSON для связки данных

{
  "telegram_id": "123456",
  "phone_number": "+79995556644"
}

Пример последовательности

  1. Пользователь получает ссылку:
https://mascotte.ru/tg-auth/?data=abcdef123456...
  1. Переходит по ней, подтверждает время и номер телефона.
  2. Сайт связывает телефон и Telegram ID, отправляет данные в сервис.