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