La verificación de un JSON Web Token (JWT) es un paso crucial para asegurar la autenticidad y seguridad de las comunicaciones. Utilizando una librería especial, podemos comprobar si el token que recibimos ha sido firmado correctamente y no ha sido alterado. Aquí te explicamos el proceso detallado y simplificado para verificar un JWT en Node.js.
¿Qué necesitamos?
Un JSON Web Token en formato de serialización compacta, que es una cadena de tres partes codificadas en base 64, separadas por puntos.
Un secreto compartido o una llave pública, dependiendo del tipo de algoritmo de firmado (simétrico o asimétrico).
La librería adecuada para manejar JWT.
¿Cómo se verifica un token?
Obtener el Token: Recibe el token desde el header de una solicitud HTTP en el endpoint correspondiente.
Verificar el Token:
Usa la librería de JWT para verificar la firma del token pasándole el token y el secreto o llave pública.
Esta operación comprueba si el token es válido y no ha expirado.
// Ejemplo de cómo verificar un token en Node.jsconst jwt =require('jsonwebtoken');// Token y secretoconst token ='your-jwt-token';const secret ='your-secret';// Verificaciónjwt.verify(token, secret,(err, decoded)=>{if(err){console.error('Error al verificar el token:', err.message);}else{console.log('Token verificado:', decoded);}});
¿Cómo podemos implementar un firmado asimétrico?
El firmado asimétrico utiliza un par de llaves: una privada para firmar el token y una pública para verificarlo. Esto añade un nivel extra de seguridad, ya que la llave privada nunca se expone.
Pasos para la implementación:
Generación de llaves: Crea un par de llaves con una herramienta como OpenSSL. Las llaves deben estar en formato PKCS8.
Cargar la llave privada: Usa filesystem de Node.js para leer tu llave privada desde un archivo.
Llave Pública: Es segura para exponer, ya que su propósito es verificar la firma.
Llave Privada: Debe mantenerse segura y nunca alojarse en lugares accesibles públicamente.
Secretos: Si usas un algoritmo simétrico, mantén el secreto bien protegido y nunca lo compartas ni lo expongas.
Desafíos prácticos
Para profundizar más, se te anima a implementar el proceso de verificación de JWT en otro lenguaje distinto a Node.js. Este ejercicio te permitirá entender mejor los principios de la criptografía involucrados y mejorar tus habilidades multiplataforma.
¡Continúa explorando y aprendiendo más sobre autenticación segura! Este conocimiento es clave para construir aplicaciones más robustas y seguras.
¿por qué al verificar solo es necesario la llave pública?
es decir, imagina que cambia el token, un usuario decodifca el payload, lo cambia y lo vuelve a codificar, si se verifica solo con la public no es peligroso? es decir, en ese caso tendriamos que cuidar la llave publica tanto asi como cuidamos la privada y eso suena medio raro la verdad.
Lo qué pasa es que a diferencia del método de encriptación, nosotros estamos es “firmando”.
Es tal como sería firmar un documento, solo tú puedes firmar documentos (tu llave privada) la llave pública solo sirve para revisar que tu firma es correcta (una lupa para ver el detalle de tu firma).
Quien tenga la llave pública solo puede comprobar que la firma es correcta, pero no firmar.
El firmado asimétrico es cómo funciona por ejemplo el protocolo HTTPS / SSH entre otras cosas.
queremos curso de criptografia
(Perdon por lo que van a leer a continuacion)
Bien chicos! Recuerden SIEMPRE que el primer caso de "clave privada" solo es cuando tienes una app "sencilla" cliente-servidor o tu proyecto es un "monolito" PERO cuando es un app que usa microservicios en su arquitectura de servidores ejemplo "hexagonal" estos servicios, se comparten entre SI la clave "publica" y 1 solo servicio tiene la "privada" que es la que autentica a los frontends y luego cuando los frontends van a los otros servicios, estos validan con la "publica" no es que esa clave debe estar en todos lados OJO!
No se rindan, go ahead 💚
quien dijo miedo al curso de criptografia?
jajajajjaja, me hiciste reir ome
Curso de criptografía? por su puesto!!! Ojalá sea una realidad!!
claro que queremos curso de criptografía
Hay que darle al curso de criptografía, sin miedo al exito.
Vamos por el curso de criptografia
Cargar la Llave privada desde archivo .pem (recomendado)
importjava.nio.file.Files;importjava.nio.file.Paths;importjava.security.KeyFactory;importjava.security.PublicKey;importjava.security.spec.X509EncodedKeySpec;importjava.util.Base64;publicclassPublicKeyLoader{publicstaticPublicKeyloadPublicKey(String path)throwsException{String key =newString(Files.readAllBytes(Paths.get(path))).replace("-----BEGIN PUBLIC KEY-----","").replace("-----END PUBLIC KEY-----","").replaceAll("\\s+","");byte[] decoded =Base64.getDecoder().decode(key);X509EncodedKeySpec spec =newX509EncodedKeySpec(decoded);KeyFactory factory =KeyFactory.getInstance("RSA");return factory.generatePublic(spec);}}
por qué al verificar solo es necesario la llave pública?
es decir, imagina que cambia el token, un usuario decodifca el payload, lo cambia y lo vuelve a codificar, si se verifica solo con la public no es peligroso? es decir, en ese caso tendriamos que cuidar la llave publica tanto asi como cuidamos la privada y eso suena medio raro la verdad.
Lo qué pasa es que a diferencia del método de encriptación, nosotros estamos es “firmando”.
Es tal como sería firmar un documento, solo tú puedes firmar documentos (tu llave privada) la llave pública solo sirve para revisar que tu firma es correcta (una lupa para ver el detalle de tu firma).
Quien tenga la llave pública solo puede comprobar que la firma es correcta, pero no firmar.
El firmado asimétrico es cómo funciona por ejemplo el protocolo HTTPS / SSH entre otras cosas.
Por fin!! Alguien que piensa en hacer un curso de criptografía, SIUUUUUUU
Este es el proceso de verificación del jwt de manera simetrica en python para un backend en FastAPI