Пользователи и доступ

Текущий пользователь как dependency

Содержание курса

0 / 1 баллов

Бронирование от имени пользователя

Свяжите новую бронь переговорной с учётной записью, найденной по проверенному JWT. Если токена нет, он недействителен или соответствующего пользователя нет в базе, откажите в создании брони.

Владельцем должен стать найденный пользователь, независимо от переданного клиентом user_id. Сохраните прежние проверки комнаты, времени и пересечений. При отказе существующие записи не меняются; при успехе появляется только новая бронь с правильным владельцем.

Что уже дано

Это самостоятельная уменьшенная лаборатория, а не миграция полного auth_owned_demo. В видимом файле уже даны FastAPI app, SQLAlchemy-модели User(id, token_subject), Room(id, name, capacity), Booking(id, room_id, user_id, starts_at, ends_at), Settings и зависимости БД, схемы и работающие операции с комнатами/бронированиями. User.id — integer FK, token_subject — постоянная строка JWT sub. Здесь нет регистрации, login и парольных операций; настоящие учебные User заранее сохранены в SQLite, а диагностический issuer подписывает настоящие JWT. Проверка get_current_user не подменяется.

Перед видимым файлом переходник создаёт принадлежащую лаборатории временную папку и задаёт DATABASE_URL (str) для её SQLite-файла и ROOMLY_DEMO_KEY (str, искусственный начальный ключ). Эти имена доступны в том же namespace. Служебная подготовка может заменить Settings и записи тестовой БД. Ни .env, ни реальный пользовательский файл БД не требуются.

Публичный переходник вызывает настоящий TestClient(app) в процессе приложения и передаёт скрытой проверке JSON статуса, тела и заголовков. Отдельная SQL Session читает сохранённые строки, в том числе user_id, которого нет в BookingOut. JWT выпускаются настоящим PyJWT для задаваемых диагностикой claims/ключей. Код ожидаемых ответов не находится в переходнике. Диагностика также вызывает get_current_user(credentials, db, settings) с настоящими HTTPAuthorizationCredentials или None и собственной Session; порядок трёх аргументов сохраните. Проверяется возврат SQL User либо HTTPException401. Изменять переходник и писать диагностические функции не нужно.

Что нужно сделать

Реализуйте get_current_user по уроку: HTTPBearer(auto_error=False), доверенный HS256 и settings.secret_key, обязательные exp/sub, действительный срок, строковый sub и поиск существующего User по token_subject. Отсутствующие или недействительные credentials, неизвестная учётная запись дают401 с WWW-Authenticate: Bearer; используйте понятный detail. Подключите get_current_user через Depends к POST /api/rooms/{room_id}/bookings и сохраните владельца из возвращённого User. JSON user_id не выбирает владельца; лишнее поле BookingIn игнорируется.

Не меняйте предоставленные модели и поведение остальных маршрутов. GET/POST /api/rooms остаются публичными; name имеет2–60символов, capacity — целое1–50. GET /api/rooms/{room_id}/bookings публично возвращает список по id. POST брони с действительным токеном сохраняет ровно одну строку и возвращает201 с id, room_id, starts_at, ends_at в UTC, без владельца и секретов. Отсутствующая комната —404/detail Room not found; пересечение в одной комнате —409/detail Booking conflict. Границы aware, ends_at позже starts_at; нарушения дают422. Соседние интервалы допустимы. Отказ не меняет существующие SQL-строки; успешное создание не меняет остальные записи.

Действительный Bearer позволяет действовать от имени своей учётной записи; это упражнение не защищает от кражи действительного токена. Имена обработчиков и конкретный синтаксис SELECT не фиксируются. Сохраняйте get_current_user как зависимость и готовое управление Session.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно. После выполнения файла проверяющая система обращается к верхнеуровневому app: публичный переходник вызывает TestClient внутри процесса приложения и передаёт результат скрытой проверке. Запускать Uvicorn, сеть, клиентский скрипт или pytest не требуется.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

РешениеPython · Python 3.12 (web: FastAPI, SQLAlchemy, pytest)
Как проверяется решение

Проверяются функции и их результаты. Собственный запуск выполняет ваш код без авторских тестов. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

Отправьте решение, чтобы увидеть результаты тестов.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.