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