@@ -175,6 +175,57 @@ def validate_scopes(self, request):
175175 request .scopes , request .client , request ):
176176 raise errors .InvalidScopeError (request = request )
177177
178+ def validate_client_confidential (self , request ):
179+ # If the client type is confidential or the client was issued client
180+ # credentials (or assigned other authentication requirements), the
181+ # client MUST authenticate with the authorization server as described
182+ # in Section 3.2.1.
183+ # https://tools.ietf.org/html/rfc6749#section-3.2.1
184+ log .debug ('Authenticating confidential client, %r.' , request )
185+ if not self .request_validator .authenticate_client (request ):
186+ log .debug ('Client authentication failed, %r.' , request )
187+ raise errors .InvalidClientError (request = request )
188+
189+ if request .client is None or \
190+ not hasattr (request .client , 'client_id' ):
191+ raise NotImplementedError ('Authenticate client must set the '
192+ 'request.client.client_id attribute '
193+ 'in authenticate_client.' )
194+
195+ if not request .client_id :
196+ request .client_id = request .client .client_id
197+ elif request .client_id != request .client .client_id :
198+ raise errors .ServerError ('Discrepency found between client identifier' )
199+
200+ def validate_client_public (self , request ):
201+ # REQUIRED, if the client is not authenticating with the
202+ # authorization server as described in Section 3.2.1.
203+ # https://tools.ietf.org/html/rfc6749#section-3.2.1
204+ log .debug ('Authenticating public client, %r.' , request )
205+ if not self .request_validator .authenticate_client_id (request .client_id , request ):
206+ log .debug ('Client authentication failed, %r.' , request )
207+ raise errors .InvalidClientError (request = request )
208+
209+ if request .client is None or \
210+ not hasattr (request .client , 'client_id' ):
211+ raise NotImplementedError ('Authenticate client must set the '
212+ 'request.client.client_id attribute '
213+ 'in authenticate_client.' )
214+
215+ if not request .client_id :
216+ request .client_id = request .client .client_id
217+ elif request .client_id != request .client .client_id :
218+ raise errors .ServerError ('Discrepency found between client identifier' )
219+
220+ def validate_client_authentication (self , request ):
221+ """Raise on failed client authentication."""
222+ # Handles confidential clients
223+ if self .request_validator .client_authentication_required (request ):
224+ self .validate_client_confidential (request )
225+ # Handles public clients
226+ else :
227+ self .validate_client_public (request )
228+
178229 def prepare_authorization_response (self , request , token , headers , body , status ):
179230 """Place token according to response mode.
180231
0 commit comments