FastAPI 的自定义身份验证

Mic*_*hal 2 python fastapi

如何为 fastapi 创建自定义身份验证?

示例:我想使用标头 {'password': 'best password'} 发出请求,并且如果标头中的密码密钥是“最佳密码”,则允许在所有视图中不更改内容的情况下查看“仅认证”内容(并与通用文档)。

lsa*_*abi 13

如果您不关心与 swagger 前端的花哨集成,您可以简单地创建一个用于验证令牌的依赖项。

    from fastapi import FastAPI, HTTPException, Depends, Request

    def verify_token(req: Request):
        token = req.headers["Authorization"]
        # Here your code for verifying the token or whatever you use
        if token is not valid:
            raise HTTPException(
                status_code=401,
                detail="Unauthorized"
            )
        return True
    
    @app.post("/auth")
    async def login(password: str):
        if password == "my_password":
            return {"token": password} # Generate your own token
    
    @app.get("/")
    async def home(authorized: bool = Depends(verify_token)):
         if authorized:
            return {"detail": "Welcome home"}
Run Code Online (Sandbox Code Playgroud)

我没有测试代码,但它应该足以让您了解它应该如何工作。

如果您关心将所有内容与 swagger UI 很好地集成,请告诉我。因为准备起来很费时间,没有必要我就不准备了。此外,您必须遵循 swagger 的实现,据我从您的问题中了解到,这并不完全符合您的要求。

编辑

由于评论中的要求,我将尝试在下面解释如何实现与swagger.

这个想法是在登录期间直接访问请求并执行一些检查,以确定请求是来自 swagger/openapi 还是来自个性化请求。然后,一旦获得参数,就照常进行认证。

登录代码如下。请注意,它必须根据参数的确切位置和名称进行调整(因为其他人问过,我已经分享了一个更通用的方法)。

@app.post("/token")
async def login(req: Request, form_data: OAuth2PasswordRequestForm = Depends()):

    # Get header's data from the raw request
    # or from the swagger login form
    user = form_data.username
    print(user)
    print(req.headers["password"])

    return {"access_token": user, "token_type": "bearer"}
Run Code Online (Sandbox Code Playgroud)

  • @Isabi +1 用于 swagger 兼容方法 (9认同)