Proteger una API Rest en Flask

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:

  1. Nos logueamos como cliente en el endpoint /login con el usuario y contraseña
  2. Si el usuario y la contraseña coinciden, JWT genera el token y se envía como respuesta al cliente
  3. 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

Proteger una API Rest en Flask y Python
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

Excelente gracias

★★★★★
“ Interesante, muchas gracias”
- Joaquín Prieto
Comparte esto en
Publicado en Desarrollo Web.