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 jsonwebtokenen 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
