kao*_*oun 13 python authentication bearer-token fastapi
我正在尝试使用文档页面传递授权标头,类似于此页面:
由于文档是在 Fast API 中自动生成的,因此我很难弄清楚这一点。我关注了此页面https://fastapi.tiangolo.com/tutorial/security/但找不到有关传递不记名令牌的任何信息。请注意,我并不是在寻找验证令牌,我只是在寻找一种通过文档页面传递不记名令牌的方法。
任何人都可以参考一些相关文档或寻求帮助。
对于那些在这里无法理解为什么 FastAPI 中的 Swagger 不在“授权”模式对话框中显示其安全方法的人,请记住,由于这一行,通过依赖项附加到路由的每个安全定义都在下注册默认情况下它的类名scheme_name,除非您在实例化相关类时明确指定Security。这样做的自然结果是,如果您Security的路由中使用了多个相似的类(例如几个APIKeyHeader()),则只有最后一个类会在 openAPI 方案定义中注册(即被 Swagger 捕获)。因此,使用多种同类证券的正确方法是scheme_name明确指定:
auth_header1 = APIKeyHeader(name='X-SECRET-1', scheme_name='secret-header-1')
auth_header2 = APIKeyHeader(name='X-SECRET-2', scheme_name='secret-header-2')
@app.get("/test")
async def test(header_value1=Security(auth_header)):
return dict(token=token)
Run Code Online (Sandbox Code Playgroud)
不能使用 Header() 来请求授权标头。
您需要一个基于 SecurityBase 的 Depends(例如 HTTPBearer)来告诉 swagger 您的 api 端点需要授权标头。
from fastapi.security import HTTPBearer
auth_scheme = HTTPBearer()
@app.get("/me")
async def echo_me(token: HTTPAuthorizationCredentials = Depends(auth_scheme))
...
Run Code Online (Sandbox Code Playgroud)
如果您希望凭证是可选的,您可以编写一个继承 HTTPBearer 或其他安全类的类。
from fastapi import Depends, HTTPException, Request
class OptionalHTTPBearer(HTTPBearer):
async def __call__(self, request: Request) -> Optional[str]:
from fastapi import status
try:
r = await super().__call__(request)
token = r.credentials
except HTTPException as ex:
assert ex.status_code == status.HTTP_403_FORBIDDEN, ex
token = None
return token
auth_scheme = OptionalHTTPBearer()
@app.get("/test")
async def test(token = Depends(auth_scheme)):
return dict(token=token)
Run Code Online (Sandbox Code Playgroud)