FastAPI从API密钥获取用户ID

lsa*_*abi 7 python python-3.x python-asyncio fastapi

在 fastAPI 中,我们可以简单地在路由器级别编写安全依赖项并保护 URL 的整个部分。

router.include_router(
    my_router,
    prefix="/mypath",
    dependencies=[Depends(auth.oauth2_scheme)]
)
Run Code Online (Sandbox Code Playgroud)

这避免了重复大量代码。

唯一的问题是我想使用路由器级别依赖项来保护 URL 的一部分,该依赖项检查用户令牌的有效性并检索该令牌的用户 ID。

我发现的唯一方法是向所有函数添加另一个依赖项,但这会导致重复我刚刚保存的代码。

长话短说,有没有办法在路由器级别添加依赖项,检索并返回用户 ID,并将返回值传递给处理函数?就像是

路由器.py

router.include_router(
        my_router,
        prefix="/mypath",
        dependencies=[user_id = Depends(auth.oauth2_scheme)]
    )
Run Code Online (Sandbox Code Playgroud)

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 {}
Run Code Online (Sandbox Code Playgroud)

Gab*_*lli 4

一旦用户在依赖函数中通过身份验证,请将 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)]
)

Run Code Online (Sandbox Code Playgroud)