ДЗ
Аутентификация.
### Цель
- Научиться выпускать и проверять JWT access-токены
- Ограничивать доступ к эндпоинтам по ролям (RBAC)
- Корректно обрабатывать статусы ошибок авторизации (401/403) и конфигурировать параметры безопасности через переменные окружения
### Исходные условия
У вас уже есть сервис FastAPI с эндпоинтом инференса модели diabetes_model.onnx (вход: Pregnancies, Glucose, BMI, Age; выход: вероятность/класс)
Базовая структура проекта и контейнеризация настроены
#### Аутентификация (JWT)
Регистрация пользователя: ввод логина/e-mail и пароля, хранение пароля только в виде хэша
Логин: при валидных учётных данных выдать JWT access-token
Токен должен включать как минимум:
- `sub` (идентификатор пользователя),
- `role` (роль пользователя),
- `exp` (время истечения),
- при необходимости `iat`/`nbf`.
Параметры безопасности задаются через переменные окружения:
- секрет
- алгоритм
- время жизни токена
Доступ к защищённым эндпоинтам только с заголовком `Authorization: Bearer <token>`
#### Авторизация (RBAC)
Ввести роли: минимум `user` и `admin`.
Правила доступа:
- Эндпоинт инференса (например, /predict) — доступен для user и admin.
- Админский эндпоинт (например, /admin/metrics или /admin/health) — только для admin.
- Реализовать проверку роли на уровне зависимостей/гейткиперов (концептуально: «пользователь должен иметь не ниже заданной роли»).
#### Поведение эндпоинтов
- /auth/register: создать пользователя; при конфликте — понятная ошибка.
- /auth/login: вернуть access-token и метаданные (например, время жизни).
- /me: вернуть профиль текущего пользователя по токену (id/username/role).
- /predict: принимать валидированный JSON с признаками; возвращать результат инференса (класс и, по возможности, вероятность/скор).
- /admin/...: один простой админ-эндпоинт (метрики, счётчик запросов, аптайм, версия сборки и т.п.).
#### Обработка ошибок и статусы
- Отсутствует/невалидный/просроченный токен → 401 Unauthorized.
- Роль недостаточна → 403 Forbidden.
- Сообщения должны быть информативными, но без утечки чувствительных деталей (не раскрывать внутренние структуры, секреты и т.д.).
#### Валидация и надёжность
- Валидация входных данных для инференса (тип, диапазоны, обязательность полей).
- Отдельные сообщения об ошибках валидации (400 Bad Request).
- Логирование ключевых событий: аутентификация, отказ в доступе, ошибки инференса.
#### Конфигурирование
- Все секреты/параметры безопасности — через окружение (секрет ключа, алгоритм, TTL).
- Возможность задать дефолтную роль при регистрации (например, user).
- (Опционально) предусмотреть «сидирование» админ-пользователя для локального запуска.
### Минимальные требования (на зачёт):
- Выпуск и верификация JWT access-токена.
- Защита эндпоинта инференса токеном.
- Встроенная RBAC с отдельным эндпоинтом, доступным только роли admin.
- Пароли хранятся в виде хэшей.
- Документация OpenAPI (/docs) открывается, защищённые эндпоинты помечены как требующие Bearer-токена.
### Дополнительно (по желанию, +)
- Refresh-токены и обновление access-токена.
- Чёрный список/ротация токенов (logout).
- Учёт попыток логина и «заморозка» аккаунта при брутфорсе.
- Ролевые матрицы доступа, расширяемые роли.
- Трассировка запросов и метрики (например, счётчик инференсов, среднее время ответа).
- Разграничение конфигов для prod/dev (разные секреты/TTL).
### Проверка/приёмка
- Без токена доступ к защищённым эндпоинтам невозможен (401).
- С токеном user доступен /predict, но недоступны админ-роуты (403).
- С токеном admin доступны и /predict, и админ-роуты.
- Ввод некорректных признаков даёт осмысленную 400-ошибку.
- Переменные окружения реально влияют на срок действия и подпись токена.
- Проект собирается и запускается в контейнере
- /docs отображает требования к авторизации