Задать вопрос
Tkreks
@Tkreks
Системный инженер

Защита ТГ webapp от мультисессий?

Делаю Mini App для ТГ.
Есть бот в котором происходит предварительная регистрация (общедоступный псевдоним, пол), далее бот кидает ссылку на mini app в которой есть мини игры, в т.ч. против других игроков.
Задача:
1) Запретить возможность открывать mini app с одного аккаунта на нескольких устройствах
2) Защита аккаунта от перехвата сессионных ключей
Как вижу это я:
ШАГ 1

1) При переходе из бота пользователя переходит на страницу /one
Туда подключен telegram-web-app.js для получения сведений о пользователе.
а) удаляем все кукисы
б) устанавливаем временный кукис в виде зашифрованного json который содержит в себе ts входа и некое ключевое слово (шифрованное значение приходит с backend, а не шифрутеся на стороне клиента). Шифрование 3DES с 64 битным ключом.
в) проверяем что пользователь открыл приложение именно через клиент ТГ(window.Telegram && Telegram.WebApp)
г) получаем от пользователя username + id.
д) перекидываем пользователя на страницу /two с параметрами /two?username=$username&userid=$id

Шаг 2

а) на backend читаем кукисы и расшифровываем строку. Если строка содержит ключевое слово + ts не старше 30 секунд + userid совпадает с userid в параметрах, идем к следующему шагу.
б) проверяем username и userid в БД, есть ли в бд или нет (прошли регистрацию?) Если есть, идем к следующему шагу.
в) удаляем кукисы
г) По websocket приходит json который содержит в себе новый зашифрованный кукис (на беке эта сессия добавляется в memcached)
д) перенаправляем пользователя на страницу /app без параметров, только с временной кукой

ШАГ 3

а) читаем кукис и расшифровываем
а1) проверяем что нет флага relaod
б) сверяем чтобы кукис был в memcache
в) сверяем что кукис не старше 30 секунд
г) расшифровывем кукис и устанавливаем на фронте параметры из кукиса
д) очищаем кукисы
е) устанавливаем новый кукис в котором будет флаг - reload:yes
ж) далее все данные гоняются через websocket. Если пользователь обновит страницу - его перекинет на /one и процедура авторизации начнется сначала
з) если пользователь войдет с другого устройства (с другого окна), в БД перезапишется активная сессия и по websocket пользователю прилетит событие что вы были авторизованы в другом окне, обновите страницу.

Вопрос, какие +\- можете сказать по такой схеме? Слабые\узкие места которые видите Вы?
Синтезировал 1000 - 10 000 одновременных открытий: дельта открытия приложения составила против 8 секунд (имеется ввиду разницу между 1000 и 10 000.
/one, /two, /app сделано из за особенностей реализации, можно было бы упростить до 1 перехода, но в моем случаем так нужно для масштабируемости (потенциально)
P.S. Из memchache я удаляю сессию после чтения на 3 шаге
P.P.S. я периодически обновляю сессионный кукис на шаге 3 через websocket
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
А зачем эти one, two, бессмысленное шифрование, какой-то непонятный набор действий, как это вообще связанно с для масштабируемостью?
Достаточно сразу коннетиться к вебсокет, а на сервере разрешить только один коннект от телеграм id
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы