Contenido protegido por token
Esta función nos permite proteger contenido de nuestro sitio web mediante la definición de tokens cuyo periodo de validez puede ser controlado de manera programática.

Explicación teórica

Con este propósito en mente, la idea es que cualquier solicitud de un objeto (asset) concreto de nuestro sitio web, por ejemplo, un manifiesto DASH (Dynamic Adaptive Streaming over HTTP) o HLS (HTTP Live Streaming), se realice indicando, necesariamente, el valor de tres parámetros obligatorios:

Parámetros necesarios

  1. 1.
    El instante a partir del cual comienza la validez del token (vf, valid from).
  2. 2.
    El instante en el cual expira la validez del token (vu, valid until).
  3. 3.
    El hash MD5 correspondiente con dicho token (h). Este hash viene determinado, a su vez, por el siguiente patrón: <vf>@<vu>@<secret>@<url excluyendo los parámetros obligatorios relativos al token (vf, vu, h)>.
Por ejemplo, si en nuestro sitio web mi-dominio.es queremos proteger con un token el recurso /lista-reproduccion.m3u8?lang=es, la petición se deberá formular incluyendo, además, los parámetros obligatorios anteriormente anunciados: /lista-reproduccion.m3u8?lang=es&vf=<vf>&vu=<vu>&h=<h>.
Asimismo, el valor de este parámetro h será el hash MD5 correspondiente con la cadena <vf>@<vu>@<secret>@/lista-reproduccion.m3u8?lang=es; y, de igual manera, <secret> será la semilla (seed) empleada en la generación del token.

¿Cómo se utiliza?

Esta función se invoca a través de nuestra cabecera TCDN-Command; así, debemos incluir el valor protect-with-token junto con el conjunto de parámetros, separados por el carácter dos puntos (:), necesarios por ésta. Concretamente, la sintaxis de la función es la siguiente: protect-with-token:secret=<secret>[:vf=<valid from>][:vu=<valid until>][:h=<hash>].
<secret> es el único de estos parámetros que es obligatorio y define la semilla (seed) que se empleará en la generación del token; es decir, se trata de la clave privada sobre la que se vertebra todo el proceso.
Opcionalmente, se pueden indicar los parámetros <valid from>, <valid until> y <hash> de modo que éstos quedan codificados manera estricta (hard-coded) en la configuración VCL correspondiente. Sin embargo, existe la posibilidad de determinar dinámicamente el valor para estos tres parámetros: bien en la propia petición (request) a través de su query string o bien mediante la asignación de cookies homónimas (vf, vu y h).

Ejemplo de token con periodo de validez estático

Por ejemplo, si en nuestro dominio mi-dominio.es quisiéramos proteger con un token el recurso referido anteriormente, /lista-reproduccion.m3u8?lang=es, estableciendo un periodo de validez del mismo por un año (por ejemplo, 2022), nos bastaría con desplegar desde el panel una configuración VCL similar a la siguiente:
1
# protect-with-token
2
sub vcl_recv {
3
if (req.http.host == "www.mi-dominio.es") {
4
if (req.url ~ "^/lista-reproduccion.m3u8\?lang=es") {
5
set req.http.TCDN-Command = "protect-with-token:secret=ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM:vf=1640991600:vu=1672527599"; # desde '01/01/2022 00:00:00' hasta '12/31/2022 23:59:59'.
6
}
7
}
8
}
Copied!
En el ejemplo anterior vemos cómo se ha definido la cadena ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM como valor para el parámetro obligatorio <secret>. Además, se han proporcionado los valores para dos de los otros tres parámetros restantes, <valid until> y <valid from>; asignándoles, respectivamente, los valores 1640991600 (1 de enero de 2022) y 1672527599 (31 de diciembre de 2022).
1
$ date --date='01/01/2022 00:00:00' +'%s'
2
1640991600
3
$ date --date='12/31/2022 23:59:59' +'%s'
4
1672527599
5
$
Copied!
En consecuencia, el único parámetro restante es h, que se corresponde con el hash MD5 relativo a la cadena [email protected]@E[email protected]/lista-reproduccion.m3u8?lang=es, es decir, 3caf5c965d2895f1705481d3a32d63b4.
1
$ echo -n "[email protected]@E[email protected]/lista-reproduccion.m3u8?lang=es" | md5sum | awk '{ print $1 }'
2
3caf5c965d2895f1705481d3a32d63b4
3
$
Copied!
Así, las peticiones, al recurso /lista-reproduccion.m3u8?lang=es que se formulen sin el parámetro h o con un parámetro h no válido devolverán un status code 401 (Unauthorized); si se realizan antes del inicio del periodo de validez, devolverán un status code 404 (Not yet valid token); o tras el fin de dicho periodo de validez, un 410 (Expired token).
Tan sólo las peticiones /lista-reproduccion.m3u8?lang=es&h=3caf5c965d2895f1705481d3a32d63b4 o, en su defecto, aquellas en donde se haya definido una cookie h con el valor correcto, devolverán el recurso (asset) solicitado en conjunción con un status code 200.

Ejemplo de token con periodo de validez dinámico

En el ejemplo anterior, el periodo de validez del token se encuentra codificado de manera estricta en la propia configuración; si deseamos que éste sea dinámico, nos bastaría con desplegar desde el panel una configuración VCL similar a la siguiente:
1
# protect-with-token
2
sub vcl_recv {
3
if (req.http.host == "www.mi-dominio.es") {
4
if (req.url ~ "^/lista-reproduccion.m3u8\?lang=es") {
5
set req.http.TCDN-Command = "protect-with-token:secret=ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM";
6
}
7
}
8
}
Copied!
De este modo, los parámetros vf y vu deberán ser, en este caso, proporcionados, bien a través de la query string en la petición (request) o bien mediante sendas cookies. Asimismo, puesto que vf y vu ahora son parámetros dinámicos, el valor de h también lo será, al ser dependiente de éstos.
Obviamente, éstos no son más que pequeños ejemplos de un caso de uso muy específico. Si tienes cualquier duda respecto a cómo integrar esta funcionalidad en tu propio dominio, por favor, no dudes en contactarnos a través de la dirección de correo electrónico [email protected].
Última actualización 6mo ago