FastAPI 身份验证与 jwt,但不是 OAuth2 - 是否可以自定义内置 OAuth2PasswordBearer?

时间:2021-07-01 11:27:50

标签: python fastapi

在我的前端,有一些带有 jwt 的自定义身份验证流,它与 OAuth2 流(在 FastAPI docs 中明确描述)不同,仅在于凭据如何发送到 /login 端点。前端使用主体 POST 中的 json 来制作 {"email": "...", "password": "..."} 而不是表单数据中的 username; password

是否有某种方法可以自定义 OAuth2PasswordBearer 或其他一些内置安全类来支持这种情况?仍然拥有带有授权表单等功能的全功能 SwaggerUI 文档会很好。

我看到有很多方法,如何支持 jwt,但大多数都没有与 SwaggerUI 文档很好地集成,将解决方案基于某些类构建到 FastAPI 本身会很好。

1 个答案:

答案 0 :(得分:1)

如果我理解您的意思,那么您唯一要更改的是传递给您的 login 端点的内容。

在 FastAPI 的文档中,他们展示了一个名为 OAuth2PasswordRequestForm 的类的用法。这个类负责输入数据的传递方式。您可以创建另一个类,该类将被视为模型,因此将在请求正文中作为 JSON 传递。

就像这样:

class OAuth2PasswordRequestJSON(BaseModel):
    grant_type: str = Field(None, regex="password")
    username: str = Field(...)
    password: str = Field(...)
    scope: List[str] = Field(default_factory=list)
    client_id: Optional[str] = None
    client_secret: Optional[str] = None

    @validator("scope", pre=True)
    def scope_from_string(cls, v):
        return v.split() if isinstance(v, str) else v


@app.post("/token")
async def login(body_data: OAuth2PasswordRequestJSON):
    ...

希望这就是你的意思。