Fachada para autenticación de JWT
Project description
Request Facade
Esta librería es una fachada de la librería requests
que añade una abstracción de la autenticación JWT mediante
configuración en el archivo properties.ini
Propiedades
Debido 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 entorno FERNET_KEY
de la cual se extraerá una llave necesaria
para desencriptar usuario y password que están en el properties.ini
y 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_api
Es el nombre o ip del host junto con su puerto de donde está localizada el API de autenticación como por ejemplo
http://127.0.0.1:5000
base_endpoint_api
Parte del endpoint que es fijo normalmente usado para marcar la versión del API y mantener una retrocompatibilidad en el largo plazo.
Ejemplo:
/v1/api
que unido a la propiedad anterior tendriamos algo como http://127.0.0.1:5000/v1/api
y 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_auth
Part del endpoint en concreto que se usa para la autenticacion como por ejemplo /auth
o /login
que mezclado con las
propiedades anteriores quedari asi http://127.0.0.1:5000/v1/api/auth
base_url_api
No se deberia de tocar es un punto de union de las tres propiedades anteriores para realizar llamadas mas simples en el código.
AUTH
Normalmente cuando enviamos los datos para la petición de auth
el 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 las keys
de los json que se envian
hacia el API de autenticación de este modo adaptarse a varios casos.
user_key
Key del parametro usado para el usuario
.
Ejemplo:
{"{user_key}": "xxxxx", "password": "xxxxx"}
user_value
Valor del parametro usado para el usuario
.
Ejemplo:
{"username": "{user_value}", "password": "xxxxx"}
password_key
Key del parametro usado para el password
.
Ejemplo:
{"username": "xxxxx", "{password_key}": "xxxxx"}
password_value
Valor del parametro usado para el password
.
Ejemplo:
{"username": "xxxxx", "password": "{password_value}"}
Configurando propiedades
Añadir que aparte de esta configuración existe una variable de entorno en el sistema llamada FERNET_KEY
, dicha llave
se puede generar de cualquier forma que sea valida para la libreria de cryptography==37.0.2
en particular para la
clase
Fernet
del paquete from import Fernet
.
Se recomienda usar esto para generar llaves validad:
from generic_utils import CleanDevGenericUtils
utils: CleanDevGenericUtils = CleanDevGenericUtils
if __name__ == '__main__':
print(utils.get_fernet_key())
mrvhq-I67IuR_vFh3L_bG-9DqVO7WOo84vxnjQdD_qg=
Una vez tengamos dicha llave la importamos al sistema export FERNET_KEY=mrvhq-I67IuR_vFh3L_bG-9DqVO7WOo84vxnjQdD_qg=
A continuación, encriptamos el usuario y la password para la autenticacion de la siguiente forma:
from generic_utils import CleanDevGenericUtils
from requests_facade.config import FERNET_KEY
utils: CleanDevGenericUtils = CleanDevGenericUtils
if __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 el properties.ini
respectivamente.
Ejemplo de uso
Una vez configurado todas las configuraciones hacemos lo siguiente
[ENDPOINT_CONFIG]
base_url_api=http://127.0.0.1:5000
base_endpoint_api=
endpoint_auth=/auth
url_api=%(base_url_api)s%(base_endpoint_api)s
[AUTH]
user_key=email
user_value=gAAAAABikQpzO4MnZd-u5Hg2i3-kdS1FkWVPr3s5xwDxsaS-1zaOj7S_XcTOV4f4qIIzW1liJaqOc_hewjRk1Udj6DS4Vj8vrNisZBZYsI-6Nmf7RdIqn9s=
password_key=password
password_value=gAAAAABikQpzpoABdCzse9Nop6dnDfcSWsKdQiufY8Q-mMsmF2Xfu_mXMM4CI-cevurPZrB7ngjD8kuCFycV78mO2zCqADZ68A==
from requests_facade import RequestFacade
from requests import Response
if __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 endpoint http://127.0.0.1:5000/test/jwt
esta securizado mientras que http://127.0.0.1:5000/test
no lo esta como
se observa en el ejemplo no tenemos que preocuparnos de añadir el Bearer
en las cabeceras ya que lo hace automaticamente.
Unicamente resta con usar el metodo req_facade.get()
o req_facade.post()
para realizar peticiones al API.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for cleandev-requests-facade-0.1.5.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5a5aea4cf75fea31db33ec099db74256da4d5b64c16d4abe64aaec79ac09775 |
|
MD5 | 7d2d2c910fdd80989c88ec4fc00b22d9 |
|
BLAKE2b-256 | a4673f2949f2061e0432fc0c86c264d059bb53e38acf8831893f263f9a75c4b0 |