【问题标题】:Custom authentication for FastAPIFastAPI 的自定义身份验证
【发布时间】:2021-01-16 15:47:02
【问题描述】:

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

示例: 我想使用标题 {'password': 'best password'} 提出请求,并且如果标题中的密码键是“最佳密码”,则允许在所有视图中不更改它的可见“仅身份验证”内容(并且与通用文档兼容) .

【问题讨论】:

  • 我不明白。您需要一个具有自定义身份验证的 API 端点。这将显示一个自定义招摇?您介意详细说明您的问题吗?
  • 我想用 Auth0 实现 JWT 授权。我不想要任何 jwt-fastapi 工具,因为在 auth0 的 python 库中就是全部。我有一个检查令牌并将其与 auth0 API 匹配的函数。我不知道如何在快速 API 中实现一个简单的方法(这是我在快速 API 中的第一个应用)
  • 这是我的简单代码。它检查身份验证令牌并将其与外部服务匹配。 pastebin.com/Pz8Mz1mG

标签: python fastapi


【解决方案1】:

如果您不关心与 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"}

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

如果您希望将所有内容与 Swagger UI 完美集成,请告诉我。因为准备时间比较长,所以没必要就不准备了。此外,您必须遵循 swagger 的实施,据我从您的问题中可以理解,这与您所要求的不完全一样。

编辑

由于cmets中的请求,下面我将尝试解释如何实现与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"}

【讨论】:

  • @Isabi +1 用于招摇兼容的方法
  • 您能否简要概述一下我们必须做些什么才能让它与 swagger 一起工作?
猜你喜欢
  • 2020-04-01
  • 2022-12-10
  • 2021-02-06
  • 2018-09-26
  • 2010-12-17
  • 2016-07-09
  • 2021-04-14
  • 2016-08-04
  • 2011-10-13
相关资源
最近更新 更多