get_current_user здесь получает user_id из query-параметра, а не из проверенной авторизации. Поэтому /users/me может вернуть чужого пользователя; Depends само по себе не проверяет личность.
def get_current_user(user_id: int):
get_current_user здесь получает user_id из query-параметра, а не из проверенной авторизации. Поэтому /users/me может вернуть чужого пользователя; Depends само по себе не проверяет личность.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def get_current_user(user_id: int): user = users.get(user_id) if user is None: raise HTTPException(status_code=404, detail="User not found") return user
@app.get("/users", response_model=list[User]) def list_users(): return [User(*user) for user in users.list()]
@app.get("/users/me", response_model=User) def read_current_user(current_user: User = Depends(get_current_user)): return current_user
Ответ
get_current_user здесь получает user_id из query-параметра, а не из проверенной авторизации. Поэтому /users/me может вернуть чужого пользователя; Depends само по себе не проверяет личность.
Идентификатор текущего пользователя должен извлекаться из проверенного токена или серверной сессии, после чего запись загружается по этому ID. Для отсутствующей или неверной аутентификации нужен согласованный 401, а права на список пользователей проверяются отдельно. response_model валидирует ответ, но не авторизует запрос. Если User — Pydantic-модель, User(*user) обычно неверно: используют именованные данные или подходящую валидацию атрибутов. Точный способ зависит от того, что возвращает users.list(). Публичная схема ответа не должна раскрывать пароли и внутренние поля.