Это учебный проект веб-приложения на Flask с системой регистрации пользователей и защитой аккаунтов через двухфакторную аутентификацию (2FA).
- Новый пользователь открывает страницу регистрации
- Вводит имя пользователя и пароль
- Выбирает способ двухфакторной аутентификации:
- TOTP — коды генерируются на телефоне в специальном приложении (Google Authenticator, Authy)
- Email — коды отправляются на указанный email
- Если выбран TOTP, пользователь сканирует QR-код в приложении на телефоне
- Пароль сохраняется в базе данных в зашифрованном виде (bcrypt)
- Пользователь открывает форму входа
- Вводит имя пользователя и пароль
- Если пароль верный, система переводит его на экран верификации 2FA:
- Для TOTP: нужно ввести код из приложения на телефоне
- Для Email: система отправляет 6-значный код на почту, пользователь вводит его
- После ввода верного кода пользователь получает доступ в приложение
- Пользователь нажимает кнопку "Выйти"
- Сессия очищается, он выходит из аккаунта
Регистрация новых пользователей с выбором метода 2FA
Безопасное хранение паролей с помощью bcrypt (криптографическое хеширование)
TOTP (Time-based One-Time Password) — динамические коды через Google Authenticator
Email 2FA — отправка кодов на электронную почту
QR-код для TOTP — удобное сканирование в приложении
Управление сессиями — отслеживание авторизованных пользователей
Безопасная конфигурация — все секреты хранятся в переменных окружения, а не в коде
- Python 3.7+
- Flask
- Flask-SQLAlchemy
- bcrypt
- pyotp
- qrcode
- python-dotenv
- Клонируй репозиторий:
git clone https://github.com/Jude51/2FA_app.git
cd 2FA_app- Установи зависимости:
python -m pip install -r requirements.txt- Создай файл
.envв корне проекта:
cp .env.example .envОтредактируй файл .env и добавь свои значения:
SECRET_KEY=your-secret-key-here
EMAIL_SENDER=your-email@example.com
EMAIL_PASSWORD=your-email-password
DATABASE_URI=sqlite:///users.dbВажно:
SECRET_KEY— случайная строка для FlaskEMAIL_SENDER— Gmail адрес для отправки кодовEMAIL_PASSWORD— пароль приложения Gmail (не главный пароль)
Используй безопасную версию приложения:
python app_safe.pyОсновной файл приложения — безопасная версия.
Особенности:
- Все секреты подгружаются из переменных окружения через
python-dotenv - Приложение выбрасывает ошибку при запуске, если отсутствуют необходимые переменные (
SECRET_KEY,EMAIL_SENDER,EMAIL_PASSWORD) - Содержит все маршруты: регистрация, вход, 2FA верификация, выход
- Поддерживает TOTP (Google Authenticator) и email-коды для двухфакторной аутентификации
- Использует SQLite для хранения пользователей и TOTP-секретов
- Пароли хешируются с помощью bcrypt
Основные маршруты:
/— главная страница (показывает имя пользователя, если авторизован)/register— регистрация нового пользователя с выбором метода 2FA/login— вход по имени и паролю/setup-2fa— настройка TOTP с QR-кодом/verify-2fa— ввод кода 2FA (TOTP или email)/logout— выход
Список всех зависимостей проекта с точными версиями:
- Flask — веб-фреймворк
- Flask-SQLAlchemy — ORM для работы с БД
- bcrypt — хеширование паролей
- pyotp — генерация и проверка TOTP
- qrcode — создание QR-кодов для TOTP
- python-dotenv — загрузка переменных окружения из
.env
Установка: pip install -r requirements.txt
Правила исключения файлов из Git репозитория. Защищает от случайной загрузки:
.env— конфиденциальные переменные окруженияapp.py— локальная версия с жёстко закодированными секретамиtest_app.py— файлы тестовinstance/users.db— база данных пользователей__pycache__/— кеш Python.pytest_cache/— кеш тестов.coverage— отчёты покрытия
Главная страница приложения:
- Если пользователь авторизован — показывает приветствие с его именем и кнопку выхода
- Если не авторизован — предлагает войти или зарегистрироваться
Форма регистрации:
- Поле для ввода имени пользователя
- Поле для ввода пароля
- Выбор метода 2FA: TOTP или email
- Поле для ввода email (если выбран email 2FA)
Форма входа:
- Поле для ввода имени пользователя
- Поле для ввода пароля
- После успешного входа переводит на верификацию 2FA
Страница настройки TOTP:
- Показывает QR-код для сканирования в Google Authenticator или другом приложении
- Содержит инструкции для пользователя
Форма верификации 2FA:
- Для TOTP: поле для ввода 6-значного кода из приложения
- Для email: поле для ввода кода, отправленного на почту
CSS-стили для оформления веб-интерфейса:
- Содержит стили для форм, кнопок, контейнеров
- Обеспечивает удобный и понятный пользовательский интерфейс
Приложение использует SQLite — простую встроенную базу данных. В ней хранится информация о пользователях:
- Имя пользователя (уникальное)
- Пароль (зашифрован с помощью bcrypt)
- TOTP-секрет (используется для генерации кодов в Google Authenticator)
- Email (для отправки кодов)
- Способ 2FA (TOTP или email)
Пароль никогда не хранится в открытом виде. Вместо этого используется bcrypt — криптографический алгоритм:
- При регистрации пароль преобразуется в хеш (это необратимо)
- При входе введённый пароль снова хешируется и сравнивается с сохранённым хешем
- Даже если кто-то получит доступ к БД, пароль не удастся восстановить
Это алгоритм для генерации одноразовых кодов:
- При регистрации приложение генерирует случайный секретный ключ (32 символа)
- Этот ключ кодируется в QR-код и передаётся пользователю
- Пользователь сканирует QR в Google Authenticator, и приложение начинает генерировать 6-значные коды
- Коды обновляются каждые 30 секунд
- При входе пользователь вводит текущий код, и приложение проверяет его
Вместо того, чтобы писать секреты прямо в коде (опасно!), используются переменные окружения:
SECRET_KEY— ключ для Flask (защита сессий)EMAIL_SENDER— Gmail адрес (отправитель писем)EMAIL_PASSWORD— пароль Gmail (не главный пароль, а специальный)DATABASE_URI— путь к БД
При запуске приложение читает эти переменные из файла .env (локально) или системных переменных (на сервере).
- Пароли хешируются с помощью bcrypt — невозможно восстановить исходный пароль
- Секреты не в коде — все ключи и пароли хранятся в
.env, которого нет в Git - HTTPS для email — используется защищённое соединение с Gmail (SSL/TLS)
- Одноразовые коды — email-коды используются один раз и удаляются
- TOTP в стандарте — Google Authenticator использует RFC 6238 (признанный стандарт)
- Проверка переменных окружения — приложение отказывается запускаться без необходимых ключей
- Flask — лёгкий веб-фреймворк на Python для создания веб-приложений
- Flask-SQLAlchemy — удобный интерфейс для работы с базами данных
- bcrypt — криптографическое хеширование паролей
- pyotp — реализация TOTP и HOTP для двухфакторной аутентификации
- qrcode — генерация QR-кодов из строк
- python-dotenv — загрузка переменных окружения из файла
.env
MIT
Jude51