【问题标题】:FastAPI get user ID from API keyFastAPI 从 API 密钥获取用户 ID
【发布时间】:2020-08-05 20:27:57
【问题描述】:

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

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

这样可以避免重复大量代码。

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

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

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

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 {}

【问题讨论】:

    标签: python python-3.x python-asyncio fastapi


    【解决方案1】:

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

    【讨论】:

    • 谢谢,没想到直接访问请求。
    • 值得补充的是,路由依赖项和普通依赖项具有两个不同的范围,并且可以复制(一个检查 auth 密钥,另一个获取数据)而不会因缓存而造成性能损失,正如所讨论的在github.com/tiangolo/fastapi/issues/424 不知道为什么我在提问的时候没有找到...
    猜你喜欢
    • 2013-11-28
    • 2020-05-31
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多