Volver a la página principal
miércoles 11 diciembre 2024
13

Cómo autenticar con JWT en Socket.IO

La autenticación con JSON Web Tokens (JWT) en Socket.IO permite una comunicación segura entre clientes y servidores. Esta técnica es ideal para proteger aplicaciones en tiempo real al validar la identidad de los usuarios.

¿Qué es JWT y cómo funciona en Socket.IO?

JWT (JSON Web Token) es un estándar para transmitir información segura entre dos partes mediante un token firmado. En Socket.IO, puedes usar JWT para autenticar clientes al establecer la conexión inicial, garantizando que solo usuarios autorizados accedan al servidor.

Implementación de JWT en Socket.IO

A continuación, se explica cómo autenticar con JWT en Socket.IO:

1. Generar un JWT en el servidor:

Crea el token en tu backend al momento de iniciar sesión o registrar un usuario.

const jwt = require('jsonwebtoken');

   const token = jwt.sign({ userId: '12345' }, 'clave_secreta', { expiresIn: '1h' });

2. Enviar el token desde el cliente:

Al conectar con el servidor de Socket.IO, envía el token como parte de los datos de conexión:

const socket = io('http://localhost:3000', {
       auth: {
           token: 'tu_token_jwt'
       }
   });

3. Validar el token en el servidor:

Intercepta la conexión en el servidor y valida el token.

const io = require('socket.io')(3000);
   const jwt = require('jsonwebtoken');

   io.use((socket, next) => {
       const token = socket.handshake.auth.token;
       if (!token) return next(new Error('Autenticación requerida'));

       try {
           const payload = jwt.verify(token, 'clave_secreta');
           socket.user = payload; // Adjuntar el payload al socket
           next();
       } catch (err) {
           next(new Error('Token inválido'));
       }
   });

   io.on('connection', (socket) => {
       console.log(`Usuario autenticado: ${socket.user.userId}`);
   });

4. Gestionar errores de autenticación:

Maneja adecuadamente los errores para informar al cliente si la autenticación falla.

Ejemplo completo

Servidor:

const io = require('socket.io')(3000);
const jwt = require('jsonwebtoken');

io.use((socket, next) => {
   const token = socket.handshake.auth.token;
   if (!token) return next(new Error('Falta el token'));

   try {
       const user = jwt.verify(token, 'clave_secreta');
       socket.user = user;
       next();
   } catch (err) {
       next(new Error('Token inválido o expirado'));
   }
});

io.on('connection', (socket) => {
   console.log(`Usuario autenticado: ${socket.user.userId}`);
   socket.on('mensaje', (data) => {
       console.log(`Mensaje de ${socket.user.userId}:`, data);
   });
});

Cliente:

const socket = io('http://localhost:3000', {
   auth: {
       token: 'tu_token_jwt'
   }
});

socket.on('connect', () => {
   console.log('Conectado al servidor');
   socket.emit('mensaje', 'Hola desde el cliente');
});

socket.on('connect_error', (err) => {
   console.error('Error de conexión:', err.message);
});

Referencias oficiales

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer