La autenticación es un proceso fundamental en el desarrollo de aplicaciones web y móviles, ya que permite verificar la identidad de los usuarios que intentan acceder a un sistema. En este módulo, aprenderemos los conceptos básicos de la autenticación, los diferentes métodos disponibles y cómo implementarlos en una aplicación Node.js.

Conceptos Clave

  1. Autenticación vs. Autorización:

    • Autenticación: Proceso de verificar la identidad de un usuario. Ejemplo: Iniciar sesión con un nombre de usuario y contraseña.
    • Autorización: Proceso de determinar si un usuario autenticado tiene permiso para realizar una acción específica. Ejemplo: Acceder a una página de administración.
  2. Métodos de Autenticación:

    • Contraseñas: El método más común, donde los usuarios proporcionan un nombre de usuario y una contraseña.
    • Tokens: Utilización de tokens (como JWT) para autenticar usuarios sin necesidad de enviar credenciales en cada solicitud.
    • OAuth: Protocolo que permite a los usuarios autorizar aplicaciones de terceros para acceder a sus recursos sin compartir sus credenciales.
  3. Almacenamiento Seguro de Contraseñas:

    • Hashing: Transformar una contraseña en una cadena de caracteres irreversibles utilizando algoritmos como bcrypt.
    • Salting: Añadir una cadena aleatoria a la contraseña antes de hashearla para proteger contra ataques de diccionario y de fuerza bruta.

Ejemplo Práctico: Autenticación Básica con Contraseñas

Paso 1: Configuración del Proyecto

Primero, crea un nuevo proyecto Node.js e instala las dependencias necesarias:

mkdir auth-example
cd auth-example
npm init -y
npm install express bcryptjs jsonwebtoken body-parser

Paso 2: Configuración del Servidor Express

Crea un archivo server.js y configura un servidor básico con Express:

const express = require('express');
const bodyParser = require('body-parser');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

const app = express();
app.use(bodyParser.json());

const users = []; // Array para almacenar usuarios (en un entorno real, usar una base de datos)

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Paso 3: Registro de Usuarios

Añade una ruta para registrar nuevos usuarios. Las contraseñas se hashean antes de almacenarse:

app.post('/register', async (req, res) => {
  const { username, password } = req.body;
  const hashedPassword = await bcrypt.hash(password, 10);
  users.push({ username, password: hashedPassword });
  res.status(201).send('User registered');
});

Paso 4: Inicio de Sesión

Añade una ruta para que los usuarios inicien sesión. Si las credenciales son correctas, se genera un token JWT:

app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username);
  if (user && await bcrypt.compare(password, user.password)) {
    const token = jwt.sign({ username: user.username }, 'secret_key', { expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).send('Invalid credentials');
  }
});

Paso 5: Middleware de Autenticación

Crea un middleware para proteger rutas que requieren autenticación:

const authenticate = (req, res, next) => {
  const token = req.header('Authorization').replace('Bearer ', '');
  try {
    const decoded = jwt.verify(token, 'secret_key');
    req.user = decoded;
    next();
  } catch (err) {
    res.status(401).send('Unauthorized');
  }
};

app.get('/protected', authenticate, (req, res) => {
  res.send('This is a protected route');
});

Ejercicio Práctico

Ejercicio 1: Implementar Logout

Implementa una ruta /logout que invalide el token JWT. (Pista: Puedes mantener una lista de tokens inválidos en memoria o en una base de datos).

Ejercicio 2: Autenticación con OAuth

Investiga e implementa la autenticación con OAuth utilizando un proveedor como Google o GitHub.

Resumen

En esta sección, hemos cubierto los conceptos básicos de la autenticación, incluyendo la diferencia entre autenticación y autorización, métodos de autenticación y almacenamiento seguro de contraseñas. También hemos implementado un ejemplo práctico de autenticación básica con contraseñas utilizando Node.js y Express. En los próximos temas, profundizaremos en técnicas más avanzadas de autenticación y autorización.

¡Continúa con el siguiente tema para aprender a usar Passport.js para la autenticación en Node.js!

Curso de Node.js

Módulo 1: Introducción a Node.js

Módulo 2: Conceptos Básicos

Módulo 3: Sistema de Archivos y E/S

Módulo 4: HTTP y Servidores Web

Módulo 5: NPM y Gestión de Paquetes

Módulo 6: Framework Express.js

Módulo 7: Bases de Datos y ORMs

Módulo 8: Autenticación y Autorización

Módulo 9: Pruebas y Depuración

Módulo 10: Temas Avanzados

Módulo 11: Despliegue y DevOps

Módulo 12: Proyectos del Mundo Real

© Copyright 2024. Todos los derechos reservados