Creación de Middleware para Autenticación con API Key

Clase 4 de 20Curso de Backend con Node.js: Autenticación con Passport.js y JWT

Resumen

¿Cómo crear un middleware para autenticación y autorización?

Crear un middleware en nuestras aplicaciones es esencial para garantizar la autenticación y autorización correcta de los usuarios. Nos permite validar las solicitudes antes de pasar a la siguiente capa o endpoint de los servicios. Aquí, exploraremos la creación de un middleware que verifique una clave API (API key) desde los headers de la solicitud y discutiremos su importancia en las comunicaciones máquina a máquina.

¿Cuál es la función de un middleware en autenticación?

Un middleware es un punto de conexión que maneja cierta lógica antes de que una solicitud llegue a su destino final en el servidor. En el contexto de autenticación:

  • Verificación de API key: El middleware verifica que una API key proporcionada en los headers coincida con una clave predefinida o almacenada en una variable de ambiente.
  • Progreso mediante next: Si la clave es correcta, el flujo pasa al siguiente middleware o servicio.
  • Rechazo de acceso: Si la API key no es válida, el acceso se niega con un mensaje de falta de autorización.

Esta forma de autenticación es común, por ejemplo, al consumir servicios de Machine Learning de grandes compañías o al interactuar con APIs de terceros como la de Marvel.

¿Cómo configurar un middleware en Node.js?

Para implementar un middleware que verifique la API key, sigue estos pasos:

  1. Crear el middleware: Define una función que revisa el valor de la API key y decide si continúa o no:

    function checkApiKey(req, res, next) {
        const apiKey = req.headers['api'];
        if (apiKey === '123') {
            return next();
        } else {
            const error = new Error('No autorizado');
            error.status = 401;
            return next(error);
        }
    }
    
    module.exports = checkApiKey;
    
  2. Integrar el middleware en la aplicación: Importa y utiliza la función en tus rutas. Por ejemplo:

    const express = require('express');
    const checkApiKey = require('./middlewares/authHandler');
    const app = express();
    
    app.use('/nuevaRuta', checkApiKey, (req, res) => {
        res.send('Hola, soy una nueva ruta');
    });
    
  3. Pruebas con herramientas como Insomnia: Realiza peticiones y verifica que el middleware funciona rechazando o permitiendo la solicitud con base en la API key ingresada en los headers.

¿Por qué es importante la variable de ambiente?

Hardcodear valores, como la API key directamente en el código, es una mala práctica. Aquí es donde entra el uso de variables de ambiente, proporcionando flexibilidad y seguridad:

  • Almacenamiento seguro: Puedes almacenar claves y configuraciones sensibles fuera del código fuente.
  • Facilidad de configuración: Cambios en las configuraciones no requieren modificaciones del código ni nuevos despliegues de la aplicación.
  • Portabilidad: Permite que el mismo código funcione en diferentes entornos con configuraciones específicas para cada caso.

Para mejorar nuestro middleware, lee la API key desde una variable de ambiente usando un archivo de configuración, por ejemplo:

const config = require('./config');

function checkApiKey(req, res, next) {
    const apiKey = req.headers['api'];
    if (apiKey === config.API_KEY) {
        return next();
    } else {
        const error = new Error('No autorizado');
        error.status = 401;
        return next(error);
    }
}

module.exports = checkApiKey;

¿Qué sigue después de la autenticación con API key?

Con una base sólida de autenticación utilizando API keys, el siguiente paso podría ser implementar un sistema más robusto que incluya la verificación de usuarios y contraseñas. Esto puede incluir:

  • Hashing de contraseñas: Asegurar que las contraseñas en la base de datos no estén en texto claro.
  • Tokens de acceso: Generar y validar tokens que puedan ofrecer un sistema de acceso a usuarios autenticados.

El dominio de estas técnicas no solo mejora la seguridad de tus aplicaciones, sino que también abre puertas a implementar otros sistemas de autenticación como OAuth o JWT. ¡Sigue aprendiendo y experimentando para enriquecer tus habilidades en desarrollo seguro!