From d2cb0f73dfcc0e2ba4eb3be7429f5bd192b5a0fb Mon Sep 17 00:00:00 2001 From: Suren Khorenyan <surenkhorenyan@gmail.com> Date: Fri, 15 Jul 2022 11:11:22 +0300 Subject: [PATCH] Allow to set custom auto error detail Allow to set custom auto error detail for HTTP Security dependencies --- fastapi/security/http.py | 47 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/fastapi/security/http.py b/fastapi/security/http.py index 738455de3..17273d91e 100644 --- a/fastapi/security/http.py +++ b/fastapi/security/http.py @@ -178,11 +178,24 @@ class HTTPBasic(HTTPBase): """ ), ] = True, + auto_error_detail: Annotated[ + str, + Doc( + """ + The text to be returned to the client when `auto_error` + raises an HTTP exception. + + It useful when you have multiple errors defined: set + different detail text to easily differentiate which error was raised. + """ + ), + ] = "Not authenticated", ): self.model = HTTPBaseModel(scheme="basic", description=description) self.scheme_name = scheme_name or self.__class__.__name__ self.realm = realm self.auto_error = auto_error + self.auto_error_detail = auto_error_detail async def __call__( # type: ignore self, request: Request @@ -197,7 +210,7 @@ class HTTPBasic(HTTPBase): if self.auto_error: raise HTTPException( status_code=HTTP_401_UNAUTHORIZED, - detail="Not authenticated", + detail=self.auto_error_detail, headers=unauthorized_headers, ) else: @@ -293,10 +306,23 @@ class HTTPBearer(HTTPBase): """ ), ] = True, + auto_error_detail: Annotated[ + str, + Doc( + """ + The text to be returned to the client when `auto_error` + raises an HTTP exception. + + It useful when you have multiple errors defined: set + different detail text to easily differentiate which error was raised. + """ + ), + ] = "Not authenticated", ): self.model = HTTPBearerModel(bearerFormat=bearerFormat, description=description) self.scheme_name = scheme_name or self.__class__.__name__ self.auto_error = auto_error + self.auto_error_detail = auto_error_detail async def __call__( self, request: Request @@ -306,7 +332,8 @@ class HTTPBearer(HTTPBase): if not (authorization and scheme and credentials): if self.auto_error: raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + status_code=HTTP_403_FORBIDDEN, + detail=self.auto_error_detail, ) else: return None @@ -395,10 +422,23 @@ class HTTPDigest(HTTPBase): """ ), ] = True, + auto_error_detail: Annotated[ + str, + Doc( + """ + The text to be returned to the client when `auto_error` + raises an HTTP exception. + + It useful when you have multiple errors defined: set + different detail text to easily differentiate which error was raised. + """ + ), + ] = "Not authenticated", ): self.model = HTTPBaseModel(scheme="digest", description=description) self.scheme_name = scheme_name or self.__class__.__name__ self.auto_error = auto_error + self.auto_error_detail = auto_error_detail async def __call__( self, request: Request @@ -408,7 +448,8 @@ class HTTPDigest(HTTPBase): if not (authorization and scheme and credentials): if self.auto_error: raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + status_code=HTTP_403_FORBIDDEN, + detail=self.auto_error_detail, ) else: return None