Комментарии 17
Задумка любопытная. Но есть нюанс. Правильно ли я понимаю, если бот в частности или телега в целом окажется по какой то причине недоступными - то в учетку зайти не получится. Просто потому что не получим push на одобрение входа?
Ну как я понимаю в таком случае надо альтернативный способ подтверждения сразу добавлять: email или смс там.
Для этого обычно используют recovery code, про которых я тут не увидел. Но во взрослых проектах, если потерял второй фактор (TOTP или SMS), то лезешь в шкаф,в папочку, и оттуда достаешь листочек с рекавери кодами - ими можно войти, перенастроить или отменить двухфакторку.
Неправильно поняли. Тоже сначала подумал об этом, но при более внимательном прочтении увидел что в настройках конфигурации есть параметр:
ALLOW_API_FAILURE_PASS
: Разрешить вход без 2FA при недоступности API Telegram.
А как это работать будет? Т.е. достаточно создать условия недоступности API телеги, и защита не сработает и уровень аутентификации с 2FA понижается до логин/пароль? Или другой алгоритм 2FA срабатывает?
Я использую библиотеку aiogram и при попытке отправить сообщение если связи с апи нет, то будет ошибка, я ее перехватываю и обрабатываю. Далее пишем в лог warning что связь была потерянна и мы пустили без 2fa пользователя при условии если эта опция ALLOW_API_FAILURE_PASS
включена . Если связь налаживается то пуш уведомление отправляется. С вашей стороны никаких действий не требуется. Единственное надо убедится что когда стартует приложение оно подключилось к боту. А иначе не поднимутся слушатели ответов от пользователя. Ну и в случаях блокировки или тотального сбоя всегда можно переключить на виндовый радиус(NPS). Я еще подумаю как можно обыграть эту ситуацию и улучшить этот сценарий с потерей связи с api. Может добавлю OPT как аварийный вариант.
except aiogram_exceptions.TelegramNetworkError as network_err:
logger.warning("Error when sending message: %s", network_err)
if Config.ALLOW_API_FAILURE_PASS:
auth_requests[normalized_username] = True
logger.warning("Allow access [%s] by API failure ClientConnectorError",
normalized_username)
Обновил сегодня логику обходного пути: вот краткое описание:
Если при запуске приложения не удаётся подключиться к API Telegram, система может продолжать работать в обходном режиме, при условии что опция ALLOW_API_FAILURE_PASS активирована. Это означает, что бот будет автоматически запущен, как только подключение к API восстановится.
Если же после запуска бота связь снова прервётся, обходной механизм будет срабатывать автоматически, при условии что он включен. Кроме того, для пользователей, у которых в панели управления отмечен чекбокс Bypass, обходной режим будет активирован постоянно независимо от настройки ALLOW_API_FAILURE_PASS и связи с api telegram.
"Ну и в случаях блокировки или тотального сбоя всегда можно переключить на виндовый радиус(NPS)." мне кажется это не совсем удачная идея. Потому что от пользователя потребуется некоторая сноровка при таком варианте событий. Чем хорош offline клиент TOTP для 2FA - что он будет работать всегда (правда не так удобен - надо 6 значный код вводить вместо того. чтобы просто кнопочку нажать). Поэтому логично было бы при сбое телеги (по разным причинам), давать клиенту возможность зайти через ТОТР, не снижая общего уровня защиты авторизации.
Я сделал версию с интеграцией OTP https://github.com/CLLlAgOB/free2faplus
Проект "Free2FAPlus" предлагает решение для двухфакторной аутентификации (2FA), интегрированное с Telegram и одноразовыми паролями (OTP). Работает это следующим образом:
Логика работы:
Если активирован только OTP, вход в систему без него невозможен.
Если активированы только уведомления через Telegram, вход без подтверждения через пуш-уведомление невозможен.
При активации и OTP, и уведомлений через Telegram: ввод пароля без OTP автоматически отправляет пуш-уведомление через Telegram. Если же к паролю добавлен OTP (разделённые заданным разделителем, по умолчанию "::"), вход в систему осуществляется напрямую, без пуш-уведомления.
Обработка новых пользователей: В случае, если 2FA не активирована и пользователь не зарегистрирован в базе данных, поведение системы зависит от настроек приложения. При активации авторегистрации и разрешении входа новым пользователям без 2FA, создаются учётные записи с Telegram ID, равным нулю. Эти пользователи могут входить в систему без 2FA(если стоит разрешение
FREE2FA_BYPASS_ENABLED
) до тех пор, пока администратор не зарегистрирует их вручную (указав ID Telegram) или не разрешит им самостоятельную регистрацию через OTP.
Это решение позволяет гибко настраивать методы аутентификации, обеспечивая удобный и безопасный доступ к системам.
![](https://habrastorage.org/getpro/habr/upload_files/ac7/abe/7c2/ac7abe7c2113688553d000d663ee6b2c.gif)
Почему просто нельзя использовать mOTP или подобные приложения?
Зачем нужны блины, если можно поесть овощи? Наверное, каждому свое удобнее. Я давно сам думал про телеграм для 2FA. Это же, считай, та же привязка к номеру телефона (который можно всегда восстановить по паспорту). Но если SMSки отправлять сложно - нужны договора с гейтами, расходы на это, то телеграм в этом плане удобнее и бесплатнее. Хотя мне кажется, лучше было бы сделать отдельный (и простой) интерфейс для телеграмма, может быть бесплатный сервис с простым интерфейсом.
СМС это крайне нежелательный способ (хотя и телега, по большому счету тоже), т.к. это не является анонимным способом авторизации.
Потому что сейчас тренд - не понимать что такое двухфакторная аутентификация и зачем она нужна. Битварден ещё более удобно сделал - OTP и пароли в одном приложении. С веб интерфейсом.
Это получается, что все мои телеграммы получат этот пуш - злоумышленнику достаточно получить доступ к любому моему устройству с телеграмом. А должен работать только на телефоне
Free2FA: Телеграм-бот для двухфакторной аутентификации