JSON Web Tokens en Symfony

json web tokens symfony

JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define un mecanismo compacto y auto-contenido de transmitir información de forma segura entre dos partes mediante un objeto JSON. Esta información puede ser verificada y confiada mediante una firma digital, normalmente usando algoritmos basados en RSA o HMAC. Básicamente permite enviar información auto-contenido de una forma lo suficientemente compacta como para enviarse en una cabecera HTTP y donde todos los datos están contenidos en la transmisión sin necesidad de acceder a una fuente externa como una base de datos.

El principal uso de JWT se encuentra en la autenticación sin estado como en el uso de una API, de forma que no sea necesario el envío del usuario y contraseña en cada petición ni la consecuente revisión en el servidor. Si quereis conocer más a fondo los usos y posibilidades de este mecanismo podeís acceder la web jwt.io.

Instalar JWT en Symfony

Lo que nos interesa es mostrar como podemos usar JWT en Symfony de forma sencilla y rápida para la autenticación de una API. Para ello usaremos el bundle LexikJWTAuthenticationBundle.

El primer paso es instalar el bundle usando composer:

Luego incluimos el bundle en AppKernel.php

Generamos claves publica / privada

Dado que vamos a usar un mecanismo de encriptación asimétrico necesitamos generar un par de claves publica y privada. Para ello supondremos que hemos creado la carpeta “var/jwt” donde colocaremos las claves.

Creamos la clave privada:

Debemos recordar la clave que usemos en la creación de la clave privada ya que la necesitaremos varias veces durante el proceso. Sin ir más lejos debemos teclearlo para crear la clave pública.

Como nota aclarar que no deberiamos commitear los ficheros de claves privada ni pública por motivos de seguridad. Incluso en la mayoría de los casos no vamos a necesitar compartir ni siquiera la clave pública.

Configuramos el bundle

Añadimos un nuevo parámetro con la clave que hemos usado en la creación de la clave privada.

En la configuración añadimos lo siguiente:

En nuestro caso hemos configurado los tokens para que caduquen en una hora pero podríamos configurarlos para que no caducasen nunca o lo hiciesen en pocos minutos dependiendo de las necesidades de nuestra aplicación.

Como crear y decodificar tokens

El uso de la librería una vez instalada es muy sencilla y solo necesitamos usar el servicio lexik_jwt_authentication.encoder

Para decodificar un token recibido volvemos a usar el mismo servicio:

Si el token no funciona devolverá false pero en caso contrario recibiremos los datos codificados en primer lugar.

Conclusión

En nuestro ejemplo solo hemos codificado un nombre de usuario pero podríamos codificar todo lo necesario para recrear un usuario y ahorrarnos la consulta a la base de datos.

Como nota final aclarar que JWT no nos garantiza que los mensajes no se vayan a leer si no que no se van a modificar por lo que garantizamos que ese token lo hemos creado nosotros (ya que solo nosotros tenemos la clave privada) por lo que es más que recomendable que todas las transmisiones de tokens sean sobre https.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *