我在尝试从测试阶段覆盖JWT验证时遇到了麻烦。
当调用API端点或我使用SwaggerUI调用它们时,验证工作正常。
我的所有端点都声明如下:
@router.get("/some-path/{id}", response_model=SomeModel, dependencies=[Depends(JWTBearer())])
async def read_card_basic(*, db: Session = Depends(get_db), id: int):
# do something
JWTBearer类有一个__call__
方法来执行验证:
async def __call__(self, request: Request):
credentials: HTTPAuthorizationCredentials = await super(JWTBearer, self).__call__(request)
if credentials:
if not credentials.scheme == "Bearer":
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid authentication scheme.")
if not self.verify_jwt(credentials.credentials):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid or expired token.")
return credentials.credentials
else:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid authorization code.")
我正在使用Pytest,并且已经在www.example.com文件中做了如下依赖项覆盖:
def pytest_configure() -> None:
"""
Pytest will identify this function automatically and will run it before running any test
"""
initialize_testing_db()
initialize_other_testing_db()
create_data()
create_other_data()
app.dependency_overrides[get_db] = get_test_db
app.dependency_overrides[get_other_db] = get_other_test_db
我尝试按照文档中的示例进行操作,但我找不到删除它的方法,因为我们从外部服务获取令牌,并且在测试期间不需要它。
任何帮助将不胜感激,我可以添加更多的信息,如果需要的话。
1条答案
按热度按时间b0zn9rqh1#
首先,将auth依赖项作为示例注入。来源
例如,在JWTBearer类之后添加
jwt_bearer = JWTBearer()
然后,像这样声明端点:
其次,创建一个类来覆盖你的JWTBearer类的行为:
最后,在
conftest.py
上,像这样覆盖依赖项:你好!