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

  1. Instala la librería jsonwebtoken en tu proyecto Node.js.
  2. Crea un script para generar un JWT con un payload que incluya el ID del usuario y su rol.

Paso 2: Verificar el JWT

  1. Crea un middleware en tu aplicación que verifique el JWT en las solicitudes entrantes.
  2. Extrae el rol del usuario del token y almacénalo en el objeto de solicitud.

Paso 3: Implementar Autorización basada en Roles

  1. Define una estructura de roles y permisos.
  2. 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.

© Copyright 2024. Todos los derechos reservados