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