Заметки на полях

Блог о CRM системах и обо всем на свете...

Telegram бот – проблема авторизации

При разработке telegram бота, который может обрабатывать и передавать информацию с ограничением по доступу, рано или поздно, возникает вопрос организации процесса авторизации внутри мессенджера telegram.

Существует два основных момента на которые обязательно следует обратить внимание:
1. Синхронизация отображения информации на различных устройствах. К примеру, все что вы пишите в telegram на телефоне, тут же отображается в вашем telegram на планшете.
2. Отсутствие механизма скрытого подтверждения идентификации авторизованного пользователя. Нет никакого механизма идентификации того с какого устройства поступают запросы в telegram. Например, вы общаетесь с ботом через телефон, а кто-то может отправить боту команду с вашего планшета и бот не сможет определить, что команда пришла не от вас.

Логин и пароль…

Если ваш telegram бот получает информацию с закрытого раздела сайта и вы имеет логин/пароль для доступа в эту часть сайта, то логично использовать те же самые логин и пароль при авторизации внутри telegram клиента. И запросить в клиенте логин и пароль совсем не сложно. Но возникает проблема №1. В тот момент как вы напишите логин и пароль в своем клиенте эти данные тут же в открытом виде отобразятся на всех подключенных устройствах. Даже если вы настроите бот таким образом, чтобы он сразу после получения логина и пароля будет удалять эти данные из чата они все равно успеют отобразиться на других устройствах и таким образом ваш логин/пароль будет скомпрометирован. Эта схема авторизации, в принципе, может считаться рабочей для ограничения доступа к малочувствительным данным, но лучше ей не пользоваться. Если уж вы хотите в прямом виде использовать пару логин/пароль, то лучше создать отдельную учетную запись для работы в telegram и не дублировать учетные данные для доступа через web.

Более безопасным способом будет запрашивать только пароль. Дело в том, что каждый чат с ботом имеет постоянный уникальный chat_id. Telegram бот получает chat_id с каждым сообщением и если вы привяжете аккаунт пользователя к chat_id, то вам останется только сопоставить полученный пароль с учетной записью связанной с конкретным chat_id. Для формирования учетной записи через сам telegram бот можно легко получить chat_id, который в дальнейшем указать при регистрации пользователя. Проблема подобной авторизации такая же, как и в первом варианте. Единственное преимущество – это отсутствие в открытом доступе логина для доступа на web сайт.

Третий способ авторизации самый безопасный. Его часто используют платежные системы для подтверждения выполнения “чувствительных” команд, таких как подтверждение платежа. В этом способе используется пин-код. Telegram бот отправляет сообщение о необходимости авторизации и привязывает к этому сообщению inline кнопки в виде цифровой клавиатуры. Telegram бот с помощь перехвата сообщений “callback_query” обрабатывает нажатие на каждую кнопку цифровой клавиатуры пошагово меняя сообщение об авторизации, показываются “звездочки” вместо нажатой цифры, чтобы пользователь видел, что его пин-код принимается и обрабатывается. При таком методе авторизации telegram клиент не отображает набранный пин-код и его никто не может увидеть. Прямой подбор такого пин-кода является не самой простой задачей, т.к. каждое нажатие на inline кнопку обрабатывается отдельно и с большой задержкой, автоматизировать такой перебор пин-кода является весьма нетривиальной задачей.

Что дальше?

Допустим вы организовали процесс авторизации пользователя в telegram клиенте. Но telegram бот никогда не узнает с вашего ли устройства он получает сообщения или они пришли с вашего потерянного планшета, на котором есть такой же telegram сеанс. Точно так же злоумышленник будет видеть все сообщения и ваши и от бота на вашем утерянном планшете. И первое что должен сделать пользователь – это отключить все сеансы на потерянных устройствах. Но даже это может не спасти от компрометации информации передаваемой в telegram клиент после авторизации пользователя. Если информация является важной и “чувствительной”, то лучше начать логировать весь сеанс чата после авторизации. Как только пользователь вызывает команду “logout” telegram бот может удалить всю отображенную информацию, поступившую в чат между login и logout. Также, не стоит забывать про timeout. Было бы совсем не плохо, чтобы ваш telegram бот автоматически выполнял команду logout после определённого времени, прошедшего после последней активности авторизованного пользователя. Если ваш telegram бот работает через метод Webhook, то можно задействовать cron для запуска скрипта для выполнения процедуры автоматического logout’a.

Как видите, “дырок” в telegram для работы с закрытой информацией полно и решить эти проблемы стандартными способами практически нереально. Поэтому, если вам нужно организовать передачу секретных данных через telegram с помощью бота, то это плохая затея. Но, возможно уровень безопасности данных, который обеспечивает telegram вполне достаточен для ваших задач…

Но если секретность это ваше все и очень хочется использовать telegram… то можно использовать канал telegram только как канал передачи данных. Т.е. нужна надстройка над telegram. Вы подаете в telegram уже зашифрованные данные, на другой стороне получив через телеграм зашифрованное сообщение оно должно быть расшифровано и отображено… вот и все…