我有一个FastAPI应用程序,我通过注入依赖函数来启用Authentication
。
controller.py
router = APIRouter(
prefix="/v2/test",
tags=["helloWorld"],
dependencies=[Depends(api_key)],
responses={404: {"description": "Not found"}},
)
Authorzation.py
async def api_key(api_key_header: str = Security(api_key_header_auth)):
if api_key_header != API_KEY:
raise HTTPException(
status_code=401,
detail="Invalid API Key",
)
这个很好用。但是我想关闭基于环境的认证。例如,我希望在localhost
环境中继续输入身份验证密钥。
1条答案
按热度按时间vtwuwzda1#
您可以创建
APIKeyHeader
类的子类,并覆盖__call__()
方法,以使用request.client.host
检查请求是否来自“安全”的client
,如localhost
或127.0.0.1
,如here所解释的。如果是这样,您可以将api_key
设置为应用程序的API_KEY
值,该值将被返回并由check_api_key()
依赖函数用于验证api_key
。如果没有特定于应用程序的API_KEY
,而是有多个API键,那么可以在__call__()
和check_api_key()
函数中检查客户端的请求来源,并且只有当客户端的主机名不在safe_clients
列表中时才会引发异常。示例
移除Swagger界面的
Authorize
按钮上面提供的示例将按预期工作,也就是说,其IP地址包含在
safe_clients
列表中的用户将不会被要求提供API密钥以向API发出请求,无论在访问/docs
处的autodocs时Swagger UI页面中是否存在Authorize
按钮。但是,如果您仍然希望从safe_clients
的UI中删除Authorize
按钮,您可以使用自定义中间件,如here所示,以便从OpenAPI模式(在/openapi.json
中)中删除securitySchemes
组件-Swagger UI实际上基于OpenAPI规范。这种方法的灵感来自前面提到的链接,以及here和here。请确保在上述示例中初始化应用后添加中间件(即afterapp = FastAPI(dependencies=...)
)