Generación y firma de tokens de reproducción de IVS - Amazon IVS

Generación y firma de tokens de reproducción de IVS

Para obtener detalles sobre cómo trabajar con JWT y las bibliotecas compatibles para firmar tokens, visite jwt.io. En la interfaz jwt.io, debes introducir la clave privada para firmar los tokens. La clave pública solo es necesaria si desea verificar los tokens.

Esquema de tokens

Todos los JWT tienen tres campos: encabezado, carga y firma.

  • El encabezado especifica lo siguiente:

    • alg es el algoritmo de firma. Este es ES384, un algoritmo de firma ECDSA que utiliza el algoritmo hash SHA-384.

    • typ es el tipo de token, JWT.

    { "alg": "ES384", "typ": "JWT" }
  • La carga contiene datos específicos de Amazon IVS:

    • channel-arn es una referencia para la solicitud de reproducción de video.

    • access-control-allow-origin es un campo opcional que se puede usar para restringir la reproducción a un origen específico, es decir, para hacer que una transmisión sea visible solo desde un sitio web específico. Por ejemplo, es posible que desee evitar que las personas integren el reproductor en otros sitios web. De forma predeterminada, la reproducción está permitida en todos los orígenes. Tenga en cuenta que esto restringe solo el cliente del navegador, y no restringe la reproducción de un cliente que no es del navegador. Este campo puede contener varios orígenes, separado por comas. Se permiten dominios comodín: cada origen puede comenzar su nombre de host por * (ejemplo: https://*.amazon.com). Si strict-origin-enforcement es true, solo pueden especificarse 5 dominios como máximo; de lo contrario, no hay máximo.

    • strict-origin-enforcement es un campo opcional que se puede utilizar para reforzar la restricción de origen especificada en el campo access-control-allow-origin. De forma predeterminada, la restricción access-control-allow-origin solo se aplica a la lista de reproducción multivariante. Si el código strict-origin-enforcement está habilitado, el servidor exigirá que el origen de la solicitud coincida con el token para todas las solicitudes de reproducción (incluidas la lista de reproducción multivariante, la lista de reproducción con variantes y los segmentos). Esto significa que todos los clientes (incluidos los clientes que no sean navegadores) deberán proporcionar un encabezado de solicitud de origen válido con cada solicitud. Utilice el método setOrigin para configurar el encabezado en los SDK de reproductor de IVS para iOS y Android. Se configura automáticamente en los navegadores web, excepto en Safari para iOS. En el caso de Safari para iOS, debe agregar crossorigin="anonymous" al elemento de video para asegurarse de que se envíe el encabezado de la solicitud de origen. Ejemplo: <video crossorigin="anonymous"></video>.

    • single-use-uuid es un campo opcional que contiene un identificador único universal (UUID) válido que se genera como parte de la creación del token. Si agrega este campo y un valor de UUID, el token asociado que genere se invalidará una vez que se utilice para buscar una lista de reproducción multivariante y ver una transmisión. Los tokens de autenticación de un solo uso dificultan que los usuarios malintencionados compartan una transmisión de sus canales privados con otros espectadores. Tenga en cuenta que cuando utilice la notificación single-use-uuid, el valor máximo de la notificación exp será de 10 minutos en el futuro.

    • viewer-id es un campo opcional que contiene un identificador que se utiliza para rastrear y hacer referencia al espectador al que se concede el token. Este campo es obligatorio para poder revocar la sesión de visualización del espectador en el futuro. La longitud máxima es de 40 caracteres y el valor debe ser una cadena. No utilice este campo para información de identificación personal, confidencial o sensible. Tenga en cuenta que cuando utilice viewer-id, el valor máximo de la notificación exp será de 10 minutos en el futuro.

    • viewer-session-version es un campo opcional que contiene una versión para asociarla a esta sesión de espectadores. Al revocar las sesiones de espectadores, este valor se puede utilizar para filtrar qué sesiones de espectadores se revocan. Por ejemplo, la especificación aquí de una marca de tiempo de Unix permitiría la revocación de todas las sesiones iniciadas antes de la hora especificada. El valor debe ser un entero con signo de 64 bits (Int64). Este campo debe proporcionarse (opcionalmente) junto con élviewer-id; no hace nada por sí solo. El valor predeterminado es 0.

    • exp es una marca de tiempo Unix para cuando caduca el token. Esto no indica la cantidad de tiempo que se puede ver la transmisión. El token se valida cuando el espectador inicializa la reproducción, no en toda la transmisión. Introduzca este valor como un valor del tipo “número entero”.

      Tenga en cuenta que una marca de tiempo de Unix es un valor numérico que representa los segundos desde 1970-01-01T 00:00:00 Z UTC hasta la fecha y hora UTC especificadas, sin tener en cuenta los segundos intercalares. Diferentes lenguajes miden las marcas de tiempo de Unix en diferentes unidades; por ejemplo, Date.now() de JavaScript devuelve el tiempo en milisegundos. (Consulte exp en la Sección 4.1.4 de JWT RFC.)

    { "aws:channel-arn": "<channel_arn>", "aws:access-control-allow-origin": "<your-origin>", "aws:strict-origin-enforcement": true, "aws:single-use-uuid": "<UUID>", "aws:viewer-id": "<viewer_id>", "aws:viewer-session-version": "<viewer_session_version>", "exp": <unix timestamp> }
  • Para crear la firma, utilice la clave privada con el algoritmo especificado en el encabezado (ES384) para firmar el encabezado codificado y la carga codificada.

    ECDSASHA384( base64UrlEncode(header) + "." + base64UrlEncode(payload), <private-key> )

Instrucciones

  1. Con el algoritmo de firma ES384, firme el token con una clave privada asociada a uno de sus recursos de clave de reproducción (consulte el ejemplo ECDSASHA384 anterior).

  2. Crear el token.

    base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature)
  3. Agregue el token firmado a la URL de reproducción como parámetro de consulta.

    https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/ api/video/v1/aws.ivs.us-west-2.123456789. channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token=<token>

Ejemplo de Node.js

A continuación, se describe una forma de generar un token en el back-end (a través de un microservicio o una aplicación sin servidor) mediante Node.js.

import jwt from "jsonwebtoken"; const getToken = () => { const privateChannelArn = process.env.DEMO_PRIVATE_CHANNEL_ARN; // private channel ARN const privateChannelPrivateKey = process.env.DEMO_PRIVATE_CHANNEL_PRIVATE_KEY; // playback private key const payload = { "aws:channel-arn": privateChannelArn, "aws:access-control-allow-origin": "*", "exp": Date.now() + (60 * 1000), // expires in 1 minute }; const token = jwt.sign(payload, privateChannelPrivateKey, { algorithm: 'ES384' }); return token; }

En la aplicación front-end, puede recuperar este token y añadirlo a la URL de reproducción del canal privado, como se indica a continuación.

const streamUrl = `https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/api/video/v1/aws.ivs.us-west-2.123456789.channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token.m3u8?token=${token}` const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play();