11"""OpenAPI core validation request validators module"""
2+ import base64
3+ import binascii
24from itertools import chain
35from six import iteritems
46import warnings
@@ -103,7 +105,7 @@ def _get_operation(self, request):
103105 def _get_security (self , request , operation ):
104106 security = operation .security or self .spec .security
105107 if not security :
106- return
108+ return {}
107109
108110 for security_requirement in security :
109111 data = {
@@ -113,6 +115,8 @@ def _get_security(self, request, operation):
113115 if all (value for value in data .values ()):
114116 return data
115117
118+ return {}
119+
116120 def _get_parameters (self , request , params ):
117121 errors = []
118122 seen = set ()
@@ -195,6 +199,22 @@ def _get_security_value(self, scheme_name, request):
195199 if scheme .type == SecuritySchemeType .API_KEY :
196200 source = getattr (request .parameters , scheme .apikey_in .value )
197201 return source .get (scheme .name )
202+ elif scheme .type == SecuritySchemeType .HTTP :
203+ auth_header = request .parameters .header .get ('Authorization' )
204+ try :
205+ auth_type , encoded_credentials = auth_header .split (' ' , 1 )
206+ except ValueError :
207+ raise ValueError ('Could not parse authorization header.' )
208+
209+ if auth_type .lower () != scheme .scheme .value :
210+ raise ValueError (
211+ 'Unknown authorization method %s' % auth_type )
212+ try :
213+ return base64 .b64decode (
214+ encoded_credentials .encode ('ascii' ), validate = True
215+ ).decode ('latin1' )
216+ except binascii .Error :
217+ raise ValueError ('Invalid base64 encoding.' )
198218
199219 warnings .warn ("Only api key security scheme type supported" )
200220
0 commit comments