En este tema, exploraremos los conceptos de autenticación y autorización en el contexto de las APIs RESTful. Aprenderemos cómo implementar estos mecanismos para asegurar nuestras APIs y controlar el acceso a los recursos.

Conceptos Clave

Autenticación

La autenticación es el proceso de verificar la identidad de un usuario o una aplicación que intenta acceder a la API. En otras palabras, es el proceso de asegurarse de que el usuario es quien dice ser.

Autorización

La autorización es el proceso de determinar si un usuario autenticado tiene permiso para acceder a un recurso específico o realizar una acción particular. Es el paso que sigue a la autenticación.

Métodos de Autenticación

  1. Autenticación Básica (Basic Authentication)

La autenticación básica es un método simple en el que el cliente envía el nombre de usuario y la contraseña codificados en Base64 en el encabezado de la solicitud HTTP.

Ejemplo de Encabezado HTTP:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Desventajas:

  • No es seguro enviar credenciales en texto plano.
  • Requiere HTTPS para proteger las credenciales.

  1. Tokens de Autenticación (Token-based Authentication)

Los tokens de autenticación son una alternativa más segura. Un token es un string único generado por el servidor después de que el usuario se autentica correctamente. Este token se envía en cada solicitud posterior.

Tipos de Tokens:

  • JWT (JSON Web Tokens): Un estándar abierto que define una forma compacta y autónoma de transmitir información de manera segura entre las partes como un objeto JSON.
  • OAuth: Un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos de los usuarios en un servidor HTTP.

Ejemplo de Encabezado HTTP con JWT:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

  1. OAuth 2.0

OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos de los usuarios en un servidor HTTP. Es ampliamente utilizado para la autenticación y autorización en APIs RESTful.

Flujos de OAuth 2.0:

  • Authorization Code Grant: Utilizado por aplicaciones web y móviles.
  • Implicit Grant: Utilizado por aplicaciones de una sola página (SPA).
  • Resource Owner Password Credentials Grant: Utilizado en aplicaciones de confianza.
  • Client Credentials Grant: Utilizado para la autenticación entre servidores.

Implementación de Autenticación y Autorización

Ejemplo Práctico: Implementación de JWT en Node.js

Paso 1: Instalación de Dependencias

npm install express jsonwebtoken body-parser

Paso 2: Configuración del Servidor

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

const app = express();
const PORT = 3000;
const SECRET_KEY = 'your_secret_key';

app.use(bodyParser.json());

// Ruta de autenticación
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    // Validar credenciales (esto es solo un ejemplo, en producción usar una base de datos)
    if (username === 'user' && password === 'password') {
        const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
        return res.json({ token });
    }
    res.status(401).send('Credenciales inválidas');
});

// Middleware de autenticación
const authenticateJWT = (req, res, next) => {
    const token = req.header('Authorization').split(' ')[1];
    if (token) {
        jwt.verify(token, SECRET_KEY, (err, user) => {
            if (err) {
                return res.sendStatus(403);
            }
            req.user = user;
            next();
        });
    } else {
        res.sendStatus(401);
    }
};

// Ruta protegida
app.get('/protected', authenticateJWT, (req, res) => {
    res.send('Este es un recurso protegido');
});

app.listen(PORT, () => {
    console.log(`Servidor corriendo en el puerto ${PORT}`);
});

Explicación del Código

  1. Dependencias: Instalamos y requerimos express, jsonwebtoken y body-parser.
  2. Configuración del Servidor: Configuramos el servidor Express y definimos una clave secreta para firmar los tokens.
  3. Ruta de Autenticación: Creamos una ruta /login que valida las credenciales y genera un token JWT si son correctas.
  4. Middleware de Autenticación: Definimos un middleware authenticateJWT que verifica el token en el encabezado de la solicitud.
  5. Ruta Protegida: Creamos una ruta /protected que solo es accesible si el token es válido.

Ejercicio Práctico

Ejercicio 1: Implementar Autenticación Básica

  1. Crea una API RESTful con una ruta /login que acepte un nombre de usuario y una contraseña.
  2. Valida las credenciales y responde con un mensaje de éxito o error.
  3. Protege una ruta /protected que solo sea accesible si se proporcionan las credenciales correctas en el encabezado HTTP.

Solución

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const PORT = 3000;

app.use(bodyParser.json());

const authenticateBasic = (req, res, next) => {
    const authHeader = req.headers['authorization'];
    if (authHeader) {
        const base64Credentials = authHeader.split(' ')[1];
        const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');
        const [username, password] = credentials.split(':');
        if (username === 'user' && password === 'password') {
            return next();
        }
    }
    res.status(401).send('Credenciales inválidas');
};

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    if (username === 'user' && password === 'password') {
        return res.send('Inicio de sesión exitoso');
    }
    res.status(401).send('Credenciales inválidas');
});

app.get('/protected', authenticateBasic, (req, res) => {
    res.send('Este es un recurso protegido');
});

app.listen(PORT, () => {
    console.log(`Servidor corriendo en el puerto ${PORT}`);
});

Resumen

En esta sección, hemos cubierto los conceptos de autenticación y autorización, explorando diferentes métodos de autenticación como la autenticación básica, tokens de autenticación y OAuth 2.0. También hemos implementado un ejemplo práctico de autenticación con JWT en Node.js y proporcionado un ejercicio para reforzar los conceptos aprendidos. Con estos conocimientos, estás preparado para asegurar tus APIs RESTful y controlar el acceso a los recursos de manera efectiva.

© Copyright 2024. Todos los derechos reservados