FastAPI получает идентификатор пользователя из ключа API - PullRequest
2 голосов
/ 05 августа 2020

В fastAPI можно просто написать зависимость безопасности на уровне маршрутизатора и защитить всю часть URL-адресов.

router.include_router(
    my_router,
    prefix="/mypath",
    dependencies=[Depends(auth.oauth2_scheme)]
)

Это позволяет избежать повторения большого количества кода.

Единственное проблема в том, что я хотел бы защитить часть URL-адресов зависимостью уровня маршрутизатора, которая проверяет действительность токена пользователя и извлекает идентификатор пользователя для этого токена.

Единственный способ, который я нашел, - это добавить еще один зависимости от всех функций, но это приводит к повторению кода, который я только что сохранил.

Короче говоря, есть ли способ добавить зависимость на уровне маршрутизатора, получить и вернуть идентификатор пользователя и передать возвращаемое значение функции обработки? Что-то вроде

router.py

router.include_router(
        my_router,
        prefix="/mypath",
        dependencies=[user_id = Depends(auth.oauth2_scheme)]
    )

my_router.py

my_router = APIRouter()

@my_router.get("/my_path")
async def get_my_path(**kwargs):
    user_id = kwargs["user_id"]
    # Do stuff with the user_id
    return {}

1 Ответ

1 голос
/ 06 августа 2020

После аутентификации пользователя в функции зависимости добавьте user_id в request.state, тогда на вашем маршруте вы сможете получить к нему доступ из объекта запроса.

async def oauth2_scheme(request: Request):
    request.state.user_id = "foo"

my_router  = APIRouter()

@my_router .get("/")
async def hello(request: Request):
    print(request.state.user_id)

app.include_router(
    my_router,
    dependencies=[Depends(oauth2_scheme)]
)

...