Обзор
Cabinet поддерживает три способа авторизации:
Email-авторизация позволяет пользователям входить в Cabinet без Telegram — через браузер.
Регистрация
Флоу регистрации
- Пользователь открывает Cabinet в браузере
- Переходит на вкладку Регистрация
- Заполняет: имя (опционально), email, пароль, подтверждение пароля
- Нажимает Зарегистрироваться
- Получает email со ссылкой верификации
- Переходит по ссылке — аккаунт подтвержден, пользователь авторизован
Валидация
- Email: проверка формата, блокировка одноразовых email-адресов (автоматически обновляемый список доменов)
- Пароль: минимум 8 символов, максимум 128
- Уникальность: email не должен быть занят другим аккаунтом
Реферальный код
При регистрации можно указать реферальный код (сохраняется из URL кампании или вводится вручную). Самореферал заблокирован.Привязка email к Telegram-аккаунту
Если пользователь уже авторизован через Telegram, он может привязать email+пароль для входа через браузер:Верификация email
После регистрации на email отправляется письмо со ссылкой:- Токен: 64 символа hex (
secrets.token_hex(32)) - Срок действия:
CABINET_EMAIL_VERIFICATION_EXPIRE_HOURS(по умолчанию 24 часа) - После перехода по ссылке: email подтвержден, пользователь получает JWT-токены
Повторная отправка
Если письмо не пришло, пользователь может запросить повторную отправку. Генерируется новый токен, старый становится недействительным.Тестовый email
Для разработки: переменнаяTEST_EMAIL позволяет создавать аккаунт с автоматической верификацией (без реального email).
Вход
- Пользователь вводит email и пароль
- Сервер проверяет пароль (bcrypt, 12 раундов)
- Проверяет что email верифицирован
- Проверяет что аккаунт активен
- Возвращает JWT access + refresh токены
JWT-токены
Refresh-токен хранится в БД как SHA-256 хеш и может быть отозван.
Автообновление токенов
- Перед каждым запросом проверяется срок access-токена (с буфером 30 секунд)
- Если истек — автоматический refresh через
POST /cabinet/auth/refresh - Если refresh не удался — редирект на страницу входа
- Параллельные запросы ожидают один refresh (без дублирования)
Сброс пароля
Запрос сброса
- Пользователь нажимает Забыли пароль?
- Вводит email
- Получает письмо со ссылкой (или не получает, если email не найден — ответ одинаковый для защиты от перебора)
CABINET_PASSWORD_RESET_EXPIRE_HOURS.
Установка нового пароля
- Пользователь переходит по ссылке
- Вводит новый пароль (минимум 8 символов) и подтверждение
- Пароль обновляется, токен сброса удаляется
- Редирект на страницу входа
Смена email
Для неверифицированного email
Прямая замена: новый email устанавливается сразу, отправляется письмо верификации на новый адрес.Для верифицированного email
- Пользователь запрашивает смену email
- На новый адрес отправляется 6-значный код
- Срок действия кода:
CABINET_EMAIL_CHANGE_CODE_EXPIRE_MINUTES(по умолчанию 15 минут) - Пользователь вводит код — email обновляется
POST /cabinet/auth/email/change— запрос сменыPOST /cabinet/auth/email/change/verify— ввод кодаPOST /cabinet/auth/email/change/cancel— отменаGET /cabinet/auth/email/change/status— статус ожидания
Отправляемые письма
Все письма поддерживают 5 языков: русский, английский, китайский, украинский, фарси.
Шаблоны можно переопределить через админ-панель Cabinet (таблица
email_templates в БД).
Безопасность
Настройка
Переменные окружения
Требования
CABINET_ENABLED=true- Настроенный SMTP для отправки писем (см. Настройка SMTP)
CABINET_URL— базовый URL для формирования ссылок в письмах
Устранение проблем
Письмо верификации не приходит
- Проверьте настройку SMTP (см. Настройка SMTP)
- Проверьте спам-папку
- Убедитесь что
CABINET_EMAIL_VERIFICATION_ENABLED=true - Проверьте логи бота на ошибки отправки email
”Email already registered”
Email уже используется другим аккаунтом. Если пользователь ранее входил через Telegram и привязывал email — используйте вход по email+паролю или Telegram.Токен верификации истек
Срок по умолчанию — 24 часа. Запросите повторную отправку письма верификации.Не работает вход после верификации
- Проверьте
CABINET_JWT_SECRET— должен совпадать между перезапусками - Убедитесь что
CABINET_URLсовпадает с реальным URL Cabinet
