11from authlib .common .errors import ContinueIteration
2+ from authlib .deprecate import deprecate
23
34from .authenticate_client import ClientAuthentication
45from .errors import InvalidScopeError
56from .errors import OAuth2Error
67from .errors import UnsupportedGrantTypeError
78from .errors import UnsupportedResponseTypeError
9+ from .hooks import Hookable
10+ from .hooks import hooked
811from .requests import JsonRequest
912from .requests import OAuth2Request
1013from .util import scope_to_list
1114
1215
13- class AuthorizationServer :
16+ class AuthorizationServer ( Hookable ) :
1417 """Authorization server that handles Authorization Endpoint and Token
1518 Endpoint.
1619
1720 :param scopes_supported: A list of supported scopes by this authorization server.
1821 """
1922
2023 def __init__ (self , scopes_supported = None ):
24+ super ().__init__ ()
2125 self .scopes_supported = scopes_supported
2226 self ._token_generators = {}
2327 self ._client_auth = None
2428 self ._authorization_grants = []
2529 self ._token_grants = []
2630 self ._endpoints = {}
31+ self ._extensions = []
2732
2833 def query_client (self , client_id ):
2934 """Query OAuth client by client_id. The client model class MUST
@@ -146,6 +151,9 @@ def authenticate_client_via_custom(query_client, request):
146151
147152 self ._client_auth .register (method , func )
148153
154+ def register_extension (self , extension ):
155+ self ._extensions .append (extension (self ))
156+
149157 def get_error_uri (self , request , error ):
150158 """Return a URI for the given error, framework may implement this method."""
151159 return None
@@ -222,6 +230,7 @@ def register_endpoint(self, endpoint):
222230 endpoints = self ._endpoints .setdefault (endpoint .ENDPOINT_NAME , [])
223231 endpoints .append (endpoint )
224232
233+ @hooked
225234 def get_authorization_grant (self , request ):
226235 """Find the authorization grant for current request.
227236
@@ -233,9 +242,9 @@ def get_authorization_grant(self, request):
233242 return _create_grant (grant_cls , extensions , request , self )
234243
235244 raise UnsupportedResponseTypeError (
236- f"The response type '{ request .response_type } ' is not supported by the server." ,
237- request .response_type ,
238- redirect_uri = request .redirect_uri ,
245+ f"The response type '{ request .payload . response_type } ' is not supported by the server." ,
246+ request .payload . response_type ,
247+ redirect_uri = request .payload . redirect_uri ,
239248 )
240249
241250 def get_consent_grant (self , request = None , end_user = None ):
@@ -254,7 +263,7 @@ def get_consent_grant(self, request=None, end_user=None):
254263 # REQUIRED if a "state" parameter was present in the client
255264 # authorization request. The exact value received from the
256265 # client.
257- error .state = request .state
266+ error .state = request .payload . state
258267 raise
259268 return grant
260269
@@ -267,7 +276,7 @@ def get_token_grant(self, request):
267276 for grant_cls , extensions in self ._token_grants :
268277 if grant_cls .check_token_endpoint (request ):
269278 return _create_grant (grant_cls , extensions , request , self )
270- raise UnsupportedGrantTypeError (request .grant_type )
279+ raise UnsupportedGrantTypeError (request .payload . grant_type )
271280
272281 def create_endpoint_response (self , name , request = None ):
273282 """Validate endpoint request and create endpoint response.
@@ -289,7 +298,8 @@ def create_endpoint_response(self, name, request=None):
289298 except OAuth2Error as error :
290299 return self .handle_error_response (request , error )
291300
292- def create_authorization_response (self , request = None , grant_user = None ):
301+ @hooked
302+ def create_authorization_response (self , request = None , grant_user = None , grant = None ):
293303 """Validate authorization request and create authorization response.
294304
295305 :param request: HTTP request instance.
@@ -300,18 +310,20 @@ def create_authorization_response(self, request=None, grant_user=None):
300310 if not isinstance (request , OAuth2Request ):
301311 request = self .create_oauth2_request (request )
302312
303- try :
304- grant = self .get_authorization_grant (request )
305- except UnsupportedResponseTypeError as error :
306- error .state = request .state
307- return self .handle_error_response (request , error )
313+ if not grant :
314+ deprecate ("The 'grant' parameter will become mandatory." , version = "1.8" )
315+ try :
316+ grant = self .get_authorization_grant (request )
317+ except UnsupportedResponseTypeError as error :
318+ error .state = request .payload .state
319+ return self .handle_error_response (request , error )
308320
309321 try :
310322 redirect_uri = grant .validate_authorization_request ()
311323 args = grant .create_authorization_response (redirect_uri , grant_user )
312324 response = self .handle_response (* args )
313325 except OAuth2Error as error :
314- error .state = request .state
326+ error .state = request .payload . state
315327 response = self .handle_error_response (request , error )
316328
317329 grant .execute_hook ("after_authorization_response" , response )
0 commit comments