flask - restful - python rest authentication
Flask werkzeug request.authorization no es otra cosa que encabezados de autorizaciĆ³n presentes (3)
Cuando use apache + WSGI, no olvide la directiva WSGIPassAuthorization On
.
Estoy PUBLICANDO algunos datos JSON y agregando un encabezado de Authorization
. Sin embargo, el objeto de solicitud no tiene la propiedad de autorización correcta. HTTP_AUTHORIZATION
y los headers
muestran los detalles de autorización adecuados.
{''authorization'': None,
''cookies'': {},
''environ'': {''CONTENT_LENGTH'': ''81'',
''CONTENT_TYPE'': u''application/json'',
''HTTP_AUTHORIZATION'': ''testkey:'',
''HTTP_CONTENT_LENGTH'': ''81'',
''HTTP_CONTENT_TYPE'': ''application/json'',
''HTTP_HOST'': ''test'',
''PATH_INFO'': ''/v1/test'',
''QUERY_STRING'': '''',
''REQUEST_METHOD'': ''POST'',
''SCRIPT_NAME'': '''',
''SERVER_NAME'': ''test'',
''SERVER_PORT'': ''80'',
''SERVER_PROTOCOL'': ''HTTP/1.1'',
''flask._preserve_context'': False,
''werkzeug.request'': <Request ''http://test/v1/test'' [POST]>,
''wsgi.errors'': <open file ''<stderr>'', mode ''w'' at 0x10d5471e0>,
''wsgi.input'': <_io.BytesIO object at 0x11074c410>,
''wsgi.multiprocess'': False,
''wsgi.multithread'': False,
''wsgi.run_once'': False,
''wsgi.url_scheme'': ''http'',
''wsgi.version'': (1, 0)},
''headers'': EnvironHeaders([(''Authorization'', testkey:''), (''Host'', u''test''), (''Content-Length'', u''81''), (''Content-Type'', u''application/json'')]),
''shallow'': False,
''url'': u''http://test/v1/test'',
''url_rule'': <Rule ''/v1/test'' (POST, OPTIONS) -> testresource>,
''view_args'': {}}
El atributo request.authorization
solo se establece cuando tiene un encabezado válido de Autorización básica o Autorización implícita ; el encabezado Authorization
tiene formatos específicos donde la primera palabra del valor del encabezado establece el tipo, y el atributo solo maneja esos dos tipos específicos (marcados por las palabras clave de tipo Basic
o Digest
).
De la documentación del atributo AuthorizationMixin.authorization
El objeto Autorización en forma analizada.
siguiendo eso a los documentos del objeto Authorization
:
Representa un encabezado de Autorización enviado por el cliente. No debe crear este tipo de objeto usted mismo, sino usarlo cuando lo devuelva la función parse_authorization_header .
que está documentado como :
Analizar un encabezado HTTP de autorización básica / resumen transmitido por el navegador web. El valor de retorno es Ninguno si el encabezado no es válido o no, de lo contrario es un objeto de
Authorization
.
Negrita énfasis mío.
Su encabezado no es un encabezado tan válido; no tiene el indicador de tipo Basic
o Digest
. Si tiene dicho encabezado, la función devuelve algo distinto de None
:
>>> from werkzeug.http import parse_authorization_header
>>> parse_authorization_header(''testkey:'')
>>> parse_authorization_header(''testkey:'') is None
True
>>> parse_authorization_header(''Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='')
{''username'': ''Aladdin'', ''password'': ''open sesame''}
>>> result = _
>>> type(result)
<class ''werkzeug.datastructures.Authorization''>
>>> result.username
''Aladdin''
>>> result.password
''open sesame''
Utilicé un encabezado de tipo Basic
allí, donde el resto del valor del encabezado es un par de nombre de usuario y contraseña codificados en base 64 separados por a :
dos puntos.
Si desea implementar su propio esquema de autenticación, solo acceda al encabezado y analícelo manualmente.
auth = request.headers.get(''authorization'')
Su encabezado de autorización (''Authorization'', ''testkey:'')
debe estar codificado en Base64 e incluir Basic
.
en python:
import base64
base64.b64encode(''testkey:'') # ''dGVzdGtleTo=''
en javascript establece tu encabezado usando btoa
:
''{"Authorization": "Basic '' + btoa(''testkey:'') + ''"}''
''{"Authorization": "Basic dGVzdGtleTo="}''
En su caso, esto provocará que el encabezado entre como:
(''Authorization'', ''Basic dGVzdGtleTo='')