Proteger una API Rest en Flask y Python
Hace unos días publiqué el paso a paso para desarrollar una API Rest con Flask y Python. Ahora veamos cómo proteger una API Rest con JWT.El módulo JWT (JSON Web Tokens) lo usamos para la creación de un token que asegurará el consumo confiable de nuestra API. Es decir, con el token garantizaremos que nuestra API sea consumida por usuario debidamente autorizados.
Instalamos el módulo JWT en Python:
pip install flask_jwt_extended
Bien, vamos a usar la misma API que montamos en el artículo anterior acerca de la creación de API con Flask, y lo que le vamos a adicionar es muy poco, o sea, vamos a adicionar el módulo JWT y creamos un endpoint para la autenticación y creación del token.
from flask import Flask, jsonify, request from flask_jwt_extended import JWTManager, jwt_required, create_access_token import modelo app = Flask(__name__) jwt = JWTManager(app) app.config["JWT_SECRET_KEY"] = "contraseña-forti-forti-fortisima-contraseña" #CREDENCIALES IMPROVISADAS A MODO PEDAGÓGICO correo = "erwin@gmail.com" contra = "LaCasit@" #ENPOINT PARA AUTENTICARSE EN LA API REST @app.route("/login", methods=["POST"]) def login(): if request.json: email = request.json["email"] password = request.json["password"] else: print("NO HAY NADA") if email == correo and password == contra: el_token = create_access_token(identity=email) returnjsonify(message="Logueado correctamente", token_de_acceso=el_token), 201 else: returnjsonify(message="Credenciales incorrectas"), 401
De todas formas comparto el main.py con la mejora que estamos viendo.
Los demás endpoints siguen siendo los mismos, excepto el endpoint /user, al que le colocamos el decorador @jwt_required() para protegerlo con el token. El funcionamiento de eso es el siguiente y podemos hacer las pruebas con curl:
- Nos logueamos como cliente en el endpoint /login con el usuario y contraseña
- Si el usuario y la contraseña coinciden, JWT genera el token y se envía como respuesta al cliente
- El cliente debe usar el token recibido para hacer uso del enpoint /user
Miremoslo con curl:
-
Nos logueamos: curl -H "Content-Type: application/json" -X POST -d '{"email":"erwin@gmail.com","password":"LaCasit@"}' http://localhost:5000/login - La API Rest responde con el token. Ejemplo del token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3MzY2MDc2NywianRpIjoiMmZhMzI2NzctNDcyNS00ODc5LWE4ZDktZmE1OGVjMzkyNjRjIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImVyd2luQGdtYWlsLmNvbSIsIm5iZiI6MTY3MzY2MDc2NywiZXhwIjoxNjczNjYxNjY3fQ.vcZbrMOVs-tb9kILMJI4t04h6haZaQmlMID17lNCghM
- Nos conectamos al endpoint /user, protegido con el decorador @jwt_required() usando el token recibido:
curl -X GET http://localhost:5000/user -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3MzY2MDc2NywianRpIjoiMmZhMzI2NzctNDcyNS00ODc5LWE4ZDktZmE1OGVjMzkyNjRjIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImVyd2luQGdtYWlsLmNvbSIsIm5iZiI6MTY3MzY2MDc2NywiZXhwIjoxNjczNjYxNjY3fQ.vcZbrMOVs-tb9kILMJI4t04h6haZaQmlMID17lNCghM"
Muestra real del ejemplo:
Nota: Recuerde que este es un ejercicio pedagógico. El usuario y la contraseña en un ambiente real se consultan desde una Base de Datos, y se encriptan con el módulo bcrypt.
Valora este artículo


