Package: cleandev-requests-facade
Request FacadeEsta librería es una fachada de la libreríarequestsque añade una abstracción de la autenticación JWT mediante
configuración en el archivoproperties.iniPropiedadesDebido a la naturaleza de la librería y que deberemos de indicar en texto claro user y password, posee una forma
de encriptar dicho contenido mediante una variable de entornoFERNET_KEYde la cual se extraerá una llave necesaria
para desencriptar usuario y password que están en elproperties.iniy asi no vulnerar ningún principio de seguridad.Existen dos grupos de propiedades:ENDPOINT_CONFIG: Relacionado con la configuración que se encarga de saber donde encontrar el endpoint del API a
consultar para obtener la autenticación.AUTH: Relaciona con el formato y datos que se le enviaran al endpoint de la autenticación.base_url_apiEs el nombre o ip del host junto con su puerto de donde está localizada el API de autenticación como por ejemplohttp://127.0.0.1:5000base_endpoint_apiParte del endpoint que es fijo normalmente usado para marcar la versión del API y mantener una retrocompatibilidad en el
largo plazo.Ejemplo:/v1/apique unido a la propiedad anterior tendriamos algo comohttp://127.0.0.1:5000/v1/apiy a partir de esta
ruta se podria acceder a la version 1 de dicha api evitando asi que modificaciones futuras afecten a cosas antiguas.endpoint_authPart del endpoint en concreto que se usa para la autenticacion como por ejemplo/autho/loginque mezclado con las
propiedades anteriores quedari asihttp://127.0.0.1:5000/v1/api/authbase_url_apiNo se deberia de tocar es un punto de union de las tres propiedades anteriores para realizar llamadas mas simples en el
código.AUTHNormalmente cuando enviamos los datos para la petición deauthel cuerpo de la peticion suele tener un aspecto similar
a{"username": "xxxxx", "password": "xxxxx"}pero otras veces es de este modo{"email": "xxxxx", "pass": "xxxxx"}para controlar todas estas variantes se a dado la opcion de iniciar el nombre de laskeysde los json que se envian
hacia el API de autenticación de este modo adaptarse a varios casos.user_keyKey del parametro usado para elusuario.Ejemplo:{"{user_key}": "xxxxx", "password": "xxxxx"}user_valueValor del parametro usado para elusuario.Ejemplo:{"username": "{user_value}", "password": "xxxxx"}password_keyKey del parametro usado para elpassword.Ejemplo:{"username": "xxxxx", "{password_key}": "xxxxx"}password_valueValor del parametro usado para elpassword.Ejemplo:{"username": "xxxxx", "password": "{password_value}"}Configurando propiedadesAñadir que aparte de esta configuración existe una variable de entorno en el sistema llamadaFERNET_KEY, dicha llave
se puede generar de cualquier forma que sea valida para la libreria decryptography==37.0.2en particular para la
claseFernetdel paquetefrom  import Fernet.Se recomienda usar esto para generar llaves validad:fromgeneric_utilsimportCleanDevGenericUtilsutils:CleanDevGenericUtils=CleanDevGenericUtilsif__name__=='__main__':print(utils.get_fernet_key())mrvhq-I67IuR_vFh3L_bG-9DqVO7WOo84vxnjQdD_qg=Una vez tengamos dicha llave la importamos al sistemaexport FERNET_KEY=mrvhq-I67IuR_vFh3L_bG-9DqVO7WOo84vxnjQdD_qg=A continuación, encriptamos el usuario y la password para la autenticacion de la siguiente forma:fromgeneric_utilsimportCleanDevGenericUtilsfromrequests_facade.configimportFERNET_KEYutils:CleanDevGenericUtils=CleanDevGenericUtilsif__name__=='__main__':username='admin'password='123456789'print(utils.encrypt(username,FERNET_KEY))print(utils.encrypt(password,FERNET_KEY))gAAAAABilNDxJbYFfPDVPi64C0wA5jOsdu6O83WVNx3-Vg2BOUJ5W8EI-AKoOfindZJJN58SOxq2klRLfqTGy6failyB_GtAAg==gAAAAABilNDxyv1pb55y8LpETyu5fBQ0AegC9z1uV8uMKIRKyZXljMVHtbJK3e4DgZvyUlI2abfqKJ9ndiV9b6cUkXAtBUZomg==y estos son los valores que deberemos de poner en elproperties.inirespectivamente.Ejemplo de usoUna vez configurado todas las configuraciones hacemos lo siguiente[ENDPOINT_CONFIG]base_url_api=http://127.0.0.1:5000base_endpoint_api=endpoint_auth=/authurl_api=%(base_url_api)s%(base_endpoint_api)s[AUTH]user_key=emailuser_value=gAAAAABikQpzO4MnZd-u5Hg2i3-kdS1FkWVPr3s5xwDxsaS-1zaOj7S_XcTOV4f4qIIzW1liJaqOc_hewjRk1Udj6DS4Vj8vrNisZBZYsI-6Nmf7RdIqn9s=password_key=passwordpassword_value=gAAAAABikQpzpoABdCzse9Nop6dnDfcSWsKdQiufY8Q-mMsmF2Xfu_mXMM4CI-cevurPZrB7ngjD8kuCFycV78mO2zCqADZ68A==fromrequests_facadeimportRequestFacadefromrequestsimportResponseif__name__=='__main__':req_facade:RequestFacade=RequestFacade(need_auth=True)resp:Response=req_facade.get(url='http://127.0.0.1:5000/test/jwt')resp:Response=req_facade.get(url='http://127.0.0.1:5000/test')El endpointhttp://127.0.0.1:5000/test/jwtesta securizado mientras quehttp://127.0.0.1:5000/testno lo esta como
se observa en el ejemplo no tenemos que preocuparnos de añadir elBeareren las cabeceras ya que lo hace automaticamente.Unicamente resta con usar el metodoreq_facade.get()oreq_facade.post()para realizar peticiones al API.