Especificación de token

Anterior Siguiente

A JSON Web Token (JWT) is defined in three parts:

  • Encabezado: contiene la definición y el formato del JWT y JWS;

  • Carga/Conjunto de reclamaciones: contiene información adicional, como ID de oyente, etiquetas de usuario, etc.;

  • Firma: firma criptográfica (es decir, hash) del encabezado y la carga, utilizando el algoritmo especificado en el encabezado.

En JWT, las partes individuales se expresan en un formato JSON compacto, codificado con Base64URL, y concatenado con puntos (".").

La codificación utilizada es Base64URL, como se define en https://tools.ietf.org/html/rfc4648#section-5, y no Base64. La diferencia es principalmente que dos caracteres fueron reemplazados por caracteres seguros para URL, y el relleno final ("=") se eliminó.

Hay muchos ejemplos en la web sobre cómo hacer esto en varios idiomas - el ejercicio se deja al lector. Para necesidades de ejemplo/desarrollo, puede usar el comando openssl para codificar Base64URL con la siguiente línea de comandos:
echo -n "Data to encode" | openssl enc -a -A | tr -d '=' | tr '/+' '_-'

Encabezado protegido de JWT

Clave

Descripción

Valor

Obligatorio

Notas

typ

Tipo,

el algoritmo de la firma JWT

 

alg

Algoritmo

la ID de la clave HS256

Identifica el algoritmo de firma como HMAC usando SHA-256

kid

ID de clave

ID de clave

La ID de la clave secreta, proporcionada por Triton

Ejemplo de encabezado de JWT

{"typ":"JWT","alg":"HS256","kid":"a1b2c3d4e5"}

Codificado con Base64URL:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ

Carga de JWT (Conjunto de reclamaciones)

Los parámetros específicos de la aplicación se definen en las guías de usuario de cada aplicación. Los siguientes parámetros son comunes a todas las aplicaciones:

Clave

Descripción

Valor

Obligatorio

Notas

iat

Hora de emisión

Marca de tiempo Unix cuando se creó el token.

El servicio lo utiliza para limitar el tiempo de vencimiento del token.

exp

Vencimiento

Marca de tiempo Unix cuando vence el token.

 

Si se proporciona, permite que el token caduque antes del tiempo máximo permitido definido por el servicio. (La caducidad predeterminada del servicio es de 60 segundos).

iss

Emisor

Identificador del componente generador del token (por ejemplo, reproductor, back-end, etc.)

 

Este identificador debe ser corto.

aud

Audiencia

td

 

Se utiliza para asegurarse de que no interpretamos un token que no está dirigido a nosotros.

sub

Sujeto

ID de usuario (de la autenticación)

 

No siempre es aplicable; por ejemplo, si el token fue generado por el reproductor en lugar de un sistema de autenticación. Si se dispone de un identificador de usuario, debe indicarse.

En el ejemplo siguiente, el parámetro específico de la aplicación "td-reg" se proporciona:

Ejemplo de conjunto de reclamaciones de JWT

{"iss":"pdvy","sub":"foo@bar.com","iat":1429802716,"td-reg":true}

Codificado con Base64URL:
eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0

Firma de JWS

  • Firma estándar HS256, como se define en el RFC de JWS.

  • Triton generará y proporcionará la clave secreta HMAC.

  • Las claves secretas se proporcionan a nivel del broadcaster (es decir, una clave es válida para todas las estaciones que forman parte del broadcaster).

  • La clave HMAC se proporcionará al emisor de una manera segura (por confirmar).

  • La clave HMAC es lo que hace que esta solución sea segura; es muy importante que se la proteja en la mayor medida posible (por ejemplo, mediante ofuscación), y que solo se transporte por canales seguros). ¡Cualquiera que posea la clave puede generar un token seguro válido!

Puede generar un HMAC-SHA256 mediante el comando openssl , de la siguiente manera:

echo -n "Data to sign" | openssl dgst -sha256 -hmac <hmac-key>

Combine esto con la sugerencia anterior para la codificación Base64URL, y puede generar la firma JWS de la siguiente manera (observe el parámetro -binary):

echo -n "<jwt-header>.<jwt-payload>" | openssl dgst -binary -sha256 -hmac <hmac-key> | openssl enc -a -A | tr -d '=' | tr '/+' '_-'

Los ejemplos mostrados anteriormente, una vez concatenados, dan como resultado el siguiente token que debe ser firmado:

Ejemplo de Encabezado+Carga de JWT

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ.eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0

Para el siguiente ejemplo, vamos a usar la cadena "ThisIsASecretValue" como clave HMAC.

La firma HS256 (es decir, SHA256 HMAC) resultante es:

Ejemplo de firma de JWS

61e35c7ebed1729bf83fc4eee98d9b46e1aa6141903349478f22bf9c3f1258a0

Codificada (como valor binario, no como secuencia) en Base64URL:
YeNcfr7Rcpv4P8Tu6Y2bRuGqYUGQM0lHjyK_nD8SWKA

El token JWT/JWS final y la firma, entonces, es:

Ejemplo de JWT Token completo (Encabezado+Carga+Firma)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ.eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0.YeNcfr7Rcpv4P8Tu6Y2bRuGqYUGQM0lHjyK_nD8SWKA