@@ -53,6 +53,25 @@ class AuthorizationRequest(BaseModel):
5353 )
5454
5555
56+ AuthorizationErrorCode = Literal [
57+ "invalid_request" ,
58+ "unauthorized_client" ,
59+ "access_denied" ,
60+ "unsupported_response_type" ,
61+ "invalid_scope" ,
62+ "server_error" ,
63+ "temporarily_unavailable" ,
64+ ]
65+
66+
67+ class AuthorizationErrorResponse (BaseModel ):
68+ error : AuthorizationErrorCode
69+ error_description : str
70+ error_uri : AnyUrl | None = None
71+ # must be set if provided in the request
72+ state : str | None = None
73+
74+
5675def validate_scope (
5776 requested_scope : str | None , client : OAuthClientInformationFull
5877) -> list [str ] | None :
@@ -84,25 +103,6 @@ def validate_redirect_uri(
84103 )
85104
86105
87- ErrorCode = Literal [
88- "invalid_request" ,
89- "unauthorized_client" ,
90- "access_denied" ,
91- "unsupported_response_type" ,
92- "invalid_scope" ,
93- "server_error" ,
94- "temporarily_unavailable" ,
95- ]
96-
97-
98- class ErrorResponse (BaseModel ):
99- error : ErrorCode
100- error_description : str
101- error_uri : AnyUrl | None = None
102- # must be set if provided in the request
103- state : str | None = None
104-
105-
106106def best_effort_extract_string (
107107 key : str , params : None | FormData | QueryParams
108108) -> str | None :
@@ -132,7 +132,9 @@ async def handle(self, request: Request) -> Response:
132132 params = None
133133
134134 async def error_response (
135- error : ErrorCode , error_description : str , attempt_load_client : bool = True
135+ error : AuthorizationErrorCode ,
136+ error_description : str ,
137+ attempt_load_client : bool = True ,
136138 ):
137139 nonlocal client , redirect_uri , state
138140 if client is None and attempt_load_client :
@@ -157,7 +159,7 @@ async def error_response(
157159 # make last-ditch effort to load state
158160 state = best_effort_extract_string ("state" , params )
159161
160- error_resp = ErrorResponse (
162+ error_resp = AuthorizationErrorResponse (
161163 error = error ,
162164 error_description = error_description ,
163165 state = state ,
@@ -194,7 +196,7 @@ async def error_response(
194196 auth_request = AuthorizationRequest .model_validate (params )
195197 state = auth_request .state # Update with validated state
196198 except ValidationError as validation_error :
197- error : ErrorCode = "invalid_request"
199+ error : AuthorizationErrorCode = "invalid_request"
198200 for e in validation_error .errors ():
199201 if e ["loc" ] == ("response_type" ,) and e ["type" ] == "literal_error" :
200202 error = "unsupported_response_type"
@@ -264,11 +266,11 @@ async def error_response(
264266
265267
266268def create_error_redirect (
267- redirect_uri : AnyUrl , error : Exception | ErrorResponse
269+ redirect_uri : AnyUrl , error : Exception | AuthorizationErrorResponse
268270) -> str :
269271 parsed_uri = urlparse (str (redirect_uri ))
270272
271- if isinstance (error , ErrorResponse ):
273+ if isinstance (error , AuthorizationErrorResponse ):
272274 # Convert ErrorResponse to dict
273275 error_dict = error .model_dump (exclude_none = True )
274276 query_params = {}
0 commit comments