@@ -43,26 +43,29 @@ class AuthorizationRequest(BaseModel):
4343 class Config :
4444 extra = "ignore"
4545
46- def validate_scope (requested_scope : str | None , client : OAuthClientInformationFull ) -> list [str ] | None :
46+ def validate_scope (requested_scope : str | None , scope : str | None ) -> list [str ] | None :
4747 if requested_scope is None :
4848 return None
4949 requested_scopes = requested_scope .split (" " )
50- allowed_scopes = [] if client . scope is None else client . scope .split (" " )
50+ allowed_scopes = [] if scope is None else scope .split (" " )
5151 for scope in requested_scopes :
5252 if scope not in allowed_scopes :
5353 raise InvalidRequestError (f"Client was not registered with scope { scope } " )
5454 return requested_scopes
5555
56- def validate_redirect_uri (auth_request : AuthorizationRequest , client : OAuthClientInformationFull ) -> AnyHttpUrl :
57- if auth_request .redirect_uri is not None :
56+ def validate_redirect_uri (redirect_uri : AnyHttpUrl | None , redirect_uris : list [AnyHttpUrl ]) -> AnyHttpUrl :
57+ if not redirect_uris :
58+ raise InvalidClientError ("Client has no registered redirect URIs" )
59+
60+ if redirect_uri is not None :
5861 # Validate redirect_uri against client's registered redirect URIs
59- if auth_request . redirect_uri not in client . redirect_uris :
62+ if redirect_uri not in redirect_uris :
6063 raise InvalidRequestError (
61- f"Redirect URI '{ auth_request . redirect_uri } ' not registered for client"
64+ f"Redirect URI '{ redirect_uri } ' not registered for client"
6265 )
63- return auth_request . redirect_uri
64- elif len (client . redirect_uris ) == 1 :
65- return client . redirect_uris [0 ]
66+ return redirect_uri
67+ elif len (redirect_uris ) == 1 :
68+ return redirect_uris [0 ]
6669 else :
6770 raise InvalidRequestError ("redirect_uri must be specified when client has multiple registered URIs" )
6871
@@ -104,8 +107,8 @@ async def authorization_handler(request: Request) -> Response:
104107
105108
106109 # do validation which is dependent on the client configuration
107- redirect_uri = validate_redirect_uri (auth_request , client )
108- scopes = validate_scope (auth_request .scope , client )
110+ redirect_uri = validate_redirect_uri (auth_request . redirect_uri , client . redirect_uris )
111+ scopes = validate_scope (auth_request .scope , client . scope )
109112
110113 auth_params = AuthorizationParams (
111114 state = auth_request .state ,
0 commit comments