Сервис временных кодов подтверждения для защиты операций. Приложение реализовано на Spring Boot, Java, PostgreSQL и JDBC.
- регистрация и логин пользователей
- JWT-аутентификация и разграничение ролей
ADMINиUSER - генерация OTP-кодов для операций
- валидация OTP-кодов
- настройка длины и времени жизни OTP-кода
- рассылка OTP через email, SMPP SMS, Telegram и сохранение в файл
- фоновая пометка просроченных кодов в статус
EXPIRED - логирование всех HTTP-запросов и бизнес-событий
Проект разделен на слои:
controllerHTTP APIserviceбизнес-логикаdaoработа с PostgreSQL через JDBCJdbcTemplatenotificationканалы доставки кодовsecurityJWT и правила доступаschedulerфоновая обработка просроченных кодов
Приложение использует три основные таблицы:
usersлогин, пароль в хешированном виде, роль и контакты пользователяotp_configактуальная конфигурация OTP-кодовotp_codesOTP-коды, статус, идентификатор операции и время жизни
Статусы OTP:
ACTIVEEXPIREDUSED
docker compose up --buildПосле запуска будут доступны:
- API приложения:
http://localhost:8080 - MailHog UI:
http://localhost:8025 - SMPPsim UI:
http://localhost:8088 - PostgreSQL:
localhost:5432
Файл с OTP-кодами для канала FILE будет сохраняться в otp-codes.log в корне проекта.
Для отправки в Telegram перед запуском нужно задать переменные окружения:
export APP_TELEGRAM_BOT_TOKEN=токен_бота
export APP_TELEGRAM_DEFAULT_CHAT_ID=chat_id
docker compose up --buildPOST /api/auth/register
{
"username": "admin",
"password": "password",
"role": "ADMIN",
"email": "admin@example.com",
"phone": "+79650000000",
"telegramChatId": "999999999"
}В системе может существовать только один администратор.
POST /api/auth/login
{
"username": "admin",
"password": "password"
}Ответ содержит JWT-токен.
GET /api/admin/config
Нужен токен администратора.
PUT /api/admin/config
{
"codeLength": 6,
"ttlSeconds": 300
}GET /api/admin/users
Возвращает всех пользователей кроме администраторов.
DELETE /api/admin/users/{id}
Удаляет пользователя и связанные OTP-коды.
POST /api/user/otp/generate
{
"operationId": "operation-1",
"channels": ["EMAIL", "SMS", "TELEGRAM", "FILE"],
"email": "user@example.com",
"phone": "+79660000000",
"telegramChatId": "123456789"
}Можно передавать один или несколько каналов сразу.
POST /api/user/otp/validate
{
"operationId": "operation-1",
"code": "223356"
}curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username":"admin",
"password":"password",
"role":"ADMIN",
"email":"admin@example.com"
}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username":"admin",
"password":"password"
}'curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username":"user1",
"password":"password",
"role":"USER",
"email":"user1@example.com",
"phone":"+79991112233"
}'curl -X POST http://localhost:8080/api/user/otp/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ТОКЕН" \
-d '{
"operationId":"operation-1",
"channels":["FILE","EMAIL"]
}'- Spring Boot Web
- Spring Boot JDBC
- Spring Security
- PostgreSQL JDBC Driver
- JJWT
- JSMPP
- Spring Mail
Устанавливаются автоматически при docker compose up --build.