En este módulo, exploraremos los conceptos fundamentales de autenticación y autorización en el contexto de microservicios. Estos dos aspectos son cruciales para asegurar que solo los usuarios y servicios autorizados puedan acceder a los recursos y funcionalidades de nuestra aplicación.
Conceptos Básicos
Autenticación
La autenticación es el proceso de verificar la identidad de un usuario o servicio. En otras palabras, es el mecanismo que asegura que quien intenta acceder a un sistema es quien dice ser.
Métodos Comunes de Autenticación:
- Contraseñas: El método más tradicional, donde el usuario proporciona un nombre de usuario y una contraseña.
- Tokens: Utilización de tokens como JWT (JSON Web Tokens) que contienen información sobre el usuario y su autenticación.
- OAuth: Un protocolo que permite a las aplicaciones obtener acceso limitado a los recursos de un usuario sin exponer sus credenciales.
- Certificados: Utilización de certificados digitales para autenticar servicios y usuarios.
Autorización
La autorización es el proceso de determinar si un usuario o servicio autenticado tiene los permisos necesarios para realizar una acción específica o acceder a un recurso.
Métodos Comunes de Autorización:
- Roles: Asignación de roles a usuarios y servicios, donde cada rol tiene permisos específicos.
- Políticas: Definición de políticas detalladas que especifican qué acciones pueden realizarse sobre qué recursos y bajo qué condiciones.
- ACLs (Listas de Control de Acceso): Listas que especifican explícitamente los permisos de cada usuario o servicio para cada recurso.
Implementación de Autenticación y Autorización en Microservicios
Autenticación con JWT
JWT (JSON Web Tokens) es una forma popular de manejar la autenticación en aplicaciones de microservicios debido a su simplicidad y eficiencia.
Estructura de un JWT:
- Header: Contiene información sobre el tipo de token y el algoritmo de cifrado.
- Payload: Contiene las declaraciones (claims) sobre el usuario y otros datos.
- Signature: Es la firma digital que asegura que el token no ha sido alterado.
Ejemplo de un JWT:
{ "header": { "alg": "HS256", "typ": "JWT" }, "payload": { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }, "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" }
Código de Ejemplo para Generar un JWT en Node.js:
const jwt = require('jsonwebtoken'); const payload = { sub: '1234567890', name: 'John Doe', iat: Math.floor(Date.now() / 1000) - 30 }; const secret = 'your-256-bit-secret'; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); console.log(token);
Autorización basada en Roles
La autorización basada en roles (RBAC) es una forma efectiva de gestionar permisos en aplicaciones de microservicios.
Ejemplo de Roles y Permisos: | Rol | Permisos | |-----------|---------------------------------| | Admin | Crear, Leer, Actualizar, Eliminar| | Editor | Leer, Actualizar | | Viewer | Leer |
Código de Ejemplo para Verificar Permisos en Node.js:
const roles = { admin: ['create', 'read', 'update', 'delete'], editor: ['read', 'update'], viewer: ['read'] }; function checkPermission(role, action) { return roles[role] && roles[role].includes(action); } // Ejemplo de uso const userRole = 'editor'; const action = 'delete'; if (checkPermission(userRole, action)) { console.log('Permiso concedido'); } else { console.log('Permiso denegado'); }
Ejercicio Práctico
Objetivo: Implementar un sistema de autenticación y autorización básico utilizando JWT y roles en una aplicación de microservicios.
Paso 1: Generar un JWT
- Instala la librería
jsonwebtoken
en tu proyecto Node.js. - Crea un script para generar un JWT con un payload que incluya el ID del usuario y su rol.
Paso 2: Verificar el JWT
- Crea un middleware en tu aplicación que verifique el JWT en las solicitudes entrantes.
- Extrae el rol del usuario del token y almacénalo en el objeto de solicitud.
Paso 3: Implementar Autorización basada en Roles
- Define una estructura de roles y permisos.
- Crea un middleware que verifique si el usuario tiene los permisos necesarios para realizar la acción solicitada.
Solución
Paso 1: Generar un JWT
const jwt = require('jsonwebtoken'); const payload = { sub: '1234567890', role: 'admin', iat: Math.floor(Date.now() / 1000) - 30 }; const secret = 'your-256-bit-secret'; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); console.log(token);
Paso 2: Verificar el JWT
const jwt = require('jsonwebtoken'); const secret = 'your-256-bit-secret'; function authenticateToken(req, res, next) { const token = req.headers['authorization']; if (!token) return res.sendStatus(401); jwt.verify(token, secret, (err, user) => { if (err) return res.sendStatus(403); req.user = user; next(); }); }
Paso 3: Implementar Autorización basada en Roles
const roles = { admin: ['create', 'read', 'update', 'delete'], editor: ['read', 'update'], viewer: ['read'] }; function authorize(action) { return (req, res, next) => { const role = req.user.role; if (roles[role] && roles[role].includes(action)) { next(); } else { res.sendStatus(403); } }; } // Uso en rutas app.get('/resource', authenticateToken, authorize('read'), (req, res) => { res.send('Recurso accesible'); });
Conclusión
En esta sección, hemos cubierto los conceptos básicos de autenticación y autorización, y cómo implementarlos en una arquitectura de microservicios utilizando JWT y roles. La autenticación asegura que los usuarios son quienes dicen ser, mientras que la autorización garantiza que solo los usuarios con los permisos adecuados puedan acceder a los recursos y realizar acciones específicas.
A medida que avanzamos en el curso, estos conceptos serán fundamentales para asegurar nuestras aplicaciones de microservicios, permitiendo un control de acceso robusto y eficiente.
Curso de Microservicios
Módulo 1: Introducción a los Microservicios
- Conceptos Básicos de Microservicios
- Ventajas y Desventajas de los Microservicios
- Comparación con Arquitectura Monolítica
Módulo 2: Diseño de Microservicios
- Principios de Diseño de Microservicios
- Descomposición de Aplicaciones Monolíticas
- Definición de Bounded Contexts
Módulo 3: Comunicación entre Microservicios
Módulo 4: Implementación de Microservicios
- Elección de Tecnologías y Herramientas
- Desarrollo de un Microservicio Simple
- Gestión de Configuración