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