with restful extended flask werkzeug

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='')