Security Architecture / Authentication
Аутентификация и сессии
Безопасный вход, JWT-токены, TOTP двухфакторная аутентификация и QR-авторизация.
Схема токенов JWT
После проверки пароля (или TOTP кода) бэкенд возвращает пару JWT токенов:
- Access Token: используется для авторизации REST и WS запросов. Время жизни — 30 минут. Подписывается секретным ключом сервера (HS256).
- Refresh Token: используется для получения нового access токена без повторного ввода пароля. Время жизни — 30 дней.
Двухфакторная аутентификация (TOTP)
Chepuhagram поддерживает встроенную 2FA на базе протокола RFC 6238 (TOTP):
- При активации сервер генерирует случайный 32-символьный Base32 секрет и временно сохраняет его в
totp_temp_secret. - Клиент сканирует секрет в виде QR-кода и добавляет в Google Authenticator / Яндекс Ключ.
- Пользователь вводит проверочный 6-значный код. Сервер верифицирует его с помощью библиотеки
pyotp. - В случае совпадения секрет переносится в основное поле
totp_secret, и 2FA становится обязательной для всех последующих входов в аккаунт.
QR-авторизация десктоп-клиентов
Позволяет авторизовать новое устройство (например, ПК) без ручного ввода пароля и мастер-пароля:
- Новое устройство генерирует UUID комнаты сопряжения и подключается к WebSocket
/ws/qr?room_id={uuid}. Выводит QR-код с этим UUID на экран. - Уже авторизованный смартфон сканирует QR-код, считывает UUID комнаты.
- Смартфон отправляет на бэкенд запрос
POST /auth/qr/approve, передавая UUID комнаты, E2EE ключи и флаг поддержки кодовcode_support: true. - Если оба устройства поддерживают подтверждение кодом, сервер генерирует 6-значный код, возвращает его смартфону для отображения на экране и посылает сигнал новому устройству о переходе в режим верификации.
- Новое устройство выводит форму для ввода 6-значного кода и TOTP (если 2FA активирована у пользователя). После ввода пользователь отправляет запрос на
POST /auth/qr/verify-codes. - Сервер валидирует все коды исключительно на своей стороне. При успешной проверке создается сессия, и авторизационный токен с E2EE ключами пересылается новому устройству через WebSocket.
При несовпадении поддержки кодов (например, новое приложение сканирует QR-код старого ПК-клиента, либо наоборот) сервер возвращает ошибку
400 Bad Request с сообщением «Несовместимые версии приложения», блокируя вход.