OTP через Telegram вместо SMS — есть подводные?

 Публичный пост

Мы начали считать, сколько нам обходятся SMS с OTP-кодами для входа пользователей — и цифры неприятно кусаются.

Поэтому начали смотреть в сторону Telegram как более дешёвую альтернативу.

Что мы уже поресерчили:

Реализация отправки OTP через Telegram-бота:

  • Пользователь авторизуется в нашем сервисе.
  • Мы проверяем, что у него уже есть связанный Telegram-аккаунт (или предлагаем привязать).
  • Отправляем OTP через Telegram-бота.

✅ Плюсы
-Telegram не берёт денег за отправку сообщений (пока?).
-Скорость доставки отличная.
-Простая интеграция (думаем про aiogram + FastAPI).

  • Можно настроить failover: если пользователь не ответил в Telegram — шлём SMS.

❌Подводные камни:

  • Блокировки и ограничения. Telegram может ограничить бота, если он выглядит как спамер
  • Юзеры без Telegram. Нужно предусмотреть fallback на SMS или email(мы в Узбекистане, тут 99.99% юзеров с телегой)
  • User matching. Нужно как-то привязывать Telegram-аккаунт к пользователю. Думаем делать это через магическую ссылку, которую пользователь открывает в Telegram — и бот его идентифицирует.
  • Безопасность. Важно убедиться, что Telegram — действительно безопасный канал для OTP. Вроде бы Telegram шифрует трафик, но не end-to-end для ботов. Тем не менее, риск перехвата кода кажется сопоставимым с обычной SMS.

Что ещё мы рассматриваем

  • Push-уведомления (например, через OneSignal или Firebase) — но у них тоже есть свои сложности: не у всех включены уведомления, плюс нужно поддерживать клиентские SDK.
  • Email-коды — дешевле, чем SMS, но часто медленнее и падают в спам и вот почта точно мало у кого будет
  • Telegram Login Widget?

Вопросы к клубу:

Кто уже внедрял OTP через Telegram в проде?
Были ли проблемы с доставкой, блокировками или безопасностью?
Есть ли кейсы, где Telegram-бот перестал работать из-за ограничений Telegram?
Насколько легитимно использовать Telegram в качестве первичного канала доставки OTP с точки зрения UX и безопасности?
Кто-то пробовал полностью заменить SMS на Telegram, без fallback? Как на это отреагировали пользователи?
Может, есть готовые решения/библиотеки, которые можно заюзать, чтобы не изобретать велосипед?
Буду благодарна за любые грабли, советы и ссылки 🙌

14 комментариев 👇

Почему не хотите TOTP, который вообще не требует провайдера?

  Развернуть 1 комментарий

😱 Комментарий удален его автором...

  Развернуть 1 комментарий

@nakopylov, Видимо потому что это сложно для простых пользователей — надо ставить специальное приложение для хранения кодов. (Да, в ios есть приложение Passwords стандатное, которое это может из коробки).

  Развернуть 1 комментарий

@muradalio, Ну, это предполагает, что им не нужно отдельно ставить телеграм, если они, например, используют вайбер.

  Развернуть 1 комментарий

@nakopylov, у нас население не использует ни вацап, ни вайбер
99.99% людей в телеге
без тг, кажется, нигого нет

  Развернуть 1 комментарий

@nakopylov, TOTP не очень безопасен как единственный способ аутентификации. Для второго фактора норм.
Причина: у клиента и у сервера лежат одни и те же секреты для генерации временного пароля. Это создаёт риски для сервиса схожие с хранением паролей в открытом виде (вместо необратимых производных типа хэшей). Да, с украденным секретом нельзя будет войти на чужой сайт. Но если у злоумышленника есть возможность читать таблицу с секретами (например, из бэкапа), он сможет войти под любой учёткой.

  Развернуть 1 комментарий

@danis, так угнав телегу он тоже сможет заходить, куда хочет.

  Развернуть 1 комментарий

@nakopylov, а вооружившись паяльником...

Дело не в доступе к клиентским устройствам. Если клиент свою телегу потерял, то он сам виноват.

Но проблема в утечках данных со стороны сервисов. Почему не положено хранить пароли в чистом виде?

  Развернуть 1 комментарий
  1. Telegram недавно создал официальную платформу, которую другие сервисы могут использовать для отправки OTP своим клиентам: https://telegram.org/blog/star-messages-gateway-2-0-and-more/ru#dopolnitelnaya-ekonomiya-na-otpravke-proverochnih-kodov
  2. Если вы хотите отправлять коды своим клиентам не через эту платформу, а через собственного бота, то не забудьте, что бот не может первым отправить соообщение пользователю: пользователь сперва должен сам начать диалог с ботом. Ну и да, вам придется как-то матчить пользователей Телеграма и пользователей вашего сервиса.
  Развернуть 1 комментарий

@dbsergey, спасибо! а достаточно просто что-то написать боту? или нужно как в вастрике привязывать через секретный код?

  Развернуть 1 комментарий

@mashinkareva, не очень просто. На днях тоже сижел рисовал схожую доставку otp. Там аглоритм получился такой

  1. Пользователь первый пишет в бота и говорит /start
  2. Бот отвечает и теперь нужно как то связать учетку в вашей системе и пользователя телеграм. Если у вас есть телефон и этот же телефон настроен у пользователя, то тут никаких проблем. Можно запросить ботом доступ к учетным данным (телефону) и сматчить внутри, но если это разные телефоны (например у меня телега на российский номер, а живу я не в рф, так что чаще в сервисах указываю другой номер), то нужно приседать дальше
  3. Бот отправляет какой нибдь код (или ссылку). Пользователь авторизовывается в вашей системе обычным образом и в свец. разделе вводит код от бота (или переходит по ссылке с секретным кодом в query параметре и вы так узнаете). Теперь бот и учетка связаны и можно высылать otp. Но тут надо понимать, что пользователь в любой момент может нажать stop bot и бот больше не сможет присывать сообщения. И тут дополнительные приседания, что бы эти ошибки обрабатывать и фолбэчить в sms.

В общем это реализуемо, но в таком случае бот должен быть прям продолжением вашего продукта, а не только способ доставки otp. Иначе совершенно не ясна мотивация пользователя этим всем заниматься. Мне, как пользователю, совершенно фиолетово сколько вам стоит отправка sms и врятли я стну привязывать телеграм бота ради того, что бы сэкономить вам денег)

  Развернуть 1 комментарий

@Vita, можно дать ссылку на бота с utm меткой сразу. Эта метка и будет кодом для связки.
То есть, когда пользователь нажимает /start, то на сервер приходит нужный код. Для пользователя это незаметно и сложнее ошибиться.

  Развернуть 1 комментарий

@phuman, О, вау. Не знал об этом! Спасибо

ссылка на доку https://core.telegram.org/api/links#bot-links

  Развернуть 1 комментарий

Маленький плюс OTP в SMS — часто они легко подтягиваются клавиатурами.
Т.е. флоу такой:

  1. Ввели логин и пароль, нажали кнопку
  2. Перешли на экран ввода кода, автоматом сфокусировались на поле ввода — вылезла клавиатура
  3. Пришла смс, над клавиатурой появился код из смс. Достаточно её нажать, и код сразу подставится.

В то время, как флоу с отп в телеге требует чуть больше шагов:
3. Пришло сообщение, переходим в телегу по пушу
4. Копируем код (хорошо, если он выделен кавычками и можно скопировать в один клик)
5. Возвращаемся и вставляем полученный код.
Выходит два лишних шага.

Можно чуть-чуть укоротить этот флоу: высылать юзеру одноразовую ссылку для входа с коротким сроком жизни вместо кода. Тогда юзеру не обязательно будет что-то копипастить.


Но вообще классная альтернатива (причем принципиально относительно близкая к TOTP) — PassKey. Формат сложный для реализации, если не юзать готовую либу: надо, чтобы клиент сгенерил ключевую пару и открытый ключ передал серверу. Затем при входе клиент при помощи закрытого ключа (доступного в идеале по биометрии) генерит подпись, а сервер открытым ключом проверяет, что она настоящая. Для юзера же вообще всё банально: вводишь логин и потом прикладываешь палец.

  Развернуть 1 комментарий

По поводу Telegram Login Widget хотел сказать вот что:
Очень редко где вижу такой способ авторизации, часто если и есть авторизация через телегу, то ее делают через бота.
Я пробовал добавлять такой виджет себе на сайт, но столкнулся с тем, что коды не приходят в 8-9 случаев из 10, хз что не так

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб