如何为 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)
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |