Esta funcionalidad permite restringir el acceso a recursos de tu sitio web mediante tokens cuya validez está controlada de forma programática.
La idea es que cualquier petición a un recurso concreto como un manifiesto DASH (Dynamic Adaptive Streaming over HTTP) o HLS (HTTP Live Streaming) debe incluir tres parámetros obligatorios que conforman el token:
vf (valid from): Timestamp a partir del cual el token es válido.
vu (valid until): Timestamp en el que el token expira.
h (hash MD5): Hash MD5 generado a partir del siguiente patrón: <vf>@<vu>@<secret>@<url sin los parámetros del token (vf, vu, h)>.
Por ejemplo, para proteger el recurso /lista-reproduccion.m3u8?lang=es en mi-dominio.com, la petición deberá incluir los parámetros de la siguiente forma:
/lista-reproduccion.m3u8?lang=es&vf=<vf>&vu=<vu>&h=<h>
El valor de h será el hash MD5 de la cadena <vf>@<vu>@<secret>@/lista-reproduccion.m3u8?lang=es, donde <secret> es la clave privada que sustenta todo el proceso de validación.
La función se activa a través del header TCDN-Command con el valor protect-with-token, seguido de los parámetros separados por dos puntos (:). La sintaxis completa es la siguiente:
protect-with-token:secret=<secret>[:vf=<valid from>][:vu=<valid until>][:h=<hash>]
El único parámetro obligatorio es <secret>. Los parámetros vf, vu y h son opcionales y pueden definirse de tres formas:
vf, vu y h).Para proteger /lista-reproduccion.m3u8?lang=es en mi-dominio.es con un token válido durante todo el año 2022, la configuración VCL a desplegar desde el dashboard sería:
# protect-with-token
sub vcl_recv {
if (req.http.host == "www.mi-dominio.es") {
if (req.url ~ "^/lista-reproduccion.m3u8\?lang=es") {
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'.
}
}
}
Los timestamps de vf y vu corresponden al inicio y fin del año 2022:
$ date --date='01/01/2022 00:00:00' +'%s'
1640991600
$ date --date='12/31/2022 23:59:59' +'%s'
1672527599
El parámetro h es el hash MD5 resultante de la siguiente cadena:
1640991600@1672527599@ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM@/lista-reproduccion.m3u8?lang=es
$ echo -n "1640991600@1672527599@ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM@/lista-reproduccion.m3u8?lang=es" | md5sum | awk '{ print $1 }'
3caf5c965d2895f1705481d3a32d63b4
Las peticiones al recurso se comportarán así según el estado del token:
| Situación | Código de respuesta |
|---|---|
Sin el parámetro h o con valor incorrecto |
401 Unauthorized |
| Antes del inicio del periodo de validez | 404 Not yet valid token |
| Tras la expiración del token | 410 Expired token |
Con h=3caf5c965d2895f1705481d3a32d63b4 o cookie h correcta |
200 OK |
Si el periodo de validez debe determinarse en tiempo de ejecución en lugar de estar fijado en la configuración, la VCL se simplifica considerablemente:
# protect-with-token
sub vcl_recv {
if (req.http.host == "www.mi-dominio.es") {
if (req.url ~ "^/lista-reproduccion.m3u8\?lang=es") {
set req.http.TCDN-Command = "protect-with-token:secret=ESnrNc86j43DDwr3fAEpKm8zdBuUPZvmBmmZxAxZVQuQD7CN5LgJLD82hdzATjFM";
}
}
}
En este caso, los parámetros vf y vu deberán incluirse en cada petición, ya sea mediante la query string o a través de cookies. Al ser dinámicos, el valor de h también lo será, ya que su cálculo depende directamente de ambos.