Un nombre y un certificado
Esta página es una traducción. El texto en inglés es el que prevalece: si ambos difieren, sigue el inglés. La traducción se ofrece por comodidad. Leer esta página en inglés
El Stage es una página HTTPS, y un navegador solo cargará contenido desde una dirección cuyo certificado ya reconozca. Un proveedor en una red doméstica no tiene ninguna de las dos cosas: nadie puede conseguir un certificado público para 192.168.1.20. Así que hay dos cosas que alojamos, para cualquier proveedor que las pida.
No tienes por qué usarlas. Un proveedor puede servir desde cualquier nombre, con cualquier certificado en el que un navegador confíe, y nada más en esta especificación depende de estas dos rutas. Son para el caso en que un nombre y un certificado serían de otro modo lo más difícil de escribir un proveedor.
Un nombre
Cada biblioteca tiene un nombre propio en nuestro dominio: <bridgeId>.letsdj.io, por ejemplo 0123456789abcdef.letsdj.io. Se te dice al emparejar, y de nuevo en cada una de las rutas de abajo. Usa hostname tal cual y no lo construyas tú.
El nombre es un registro A, y tú nos dices a qué debe apuntar:
POST https://api.lets.dj/providers/address
Authorization: Bearer <sync token>
Content-Type: application/json
{ "address": "192.168.1.20" }
{
"ok": true,
"hostname": "0123456789abcdef.letsdj.io",
"address": "192.168.1.20",
"ttl": 60,
"changed": false
}
Informa de la dirección cuando arranques, y de nuevo cada vez que cambie, que es lo que mantiene el nombre apuntando al sitio correcto cuando una máquina pasa del wifi de casa a un punto de acceso del móvil. changed dice si hubo que escribir el registro o si ya tenía ese valor. El registro se publica con un tiempo de vida de 60 segundos.
La dirección debe ser IPv4, en formato de cuatro números separados por puntos, y debe ser una a la que no se pueda llegar desde internet: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, link-local (169.254.0.0/16) o carrier-grade NAT (100.64.0.0/10). Cualquier otra se rechaza. Vamos a escribir lo que envíes en una zona DNS pública, y sin comprobarlo sería un resolvedor autoritativo gratuito para cualquier cosa, apuntando a cualquier sitio. Un nombre que solo puede resolverse a la red propia de alguien es además lo que hace seguro que la zona pueda ser leída por cualquiera. También se rechazan los octetos con ceros a la izquierda, porque 010.0.0.1 significa cosas distintas para analizadores distintos.
- 400
invalid_address: no es una dirección IPv4 en formato de cuatro números separados por puntos. - 400
address_not_private: una dirección válida, pero que no está en ninguno de los rangos anteriores. - 403
unknown_sync_token, y 401missing_token. - 502
dns_unavailable: no se pudo escribir el registro en este momento. Inténtalo de nuevo en breve. - 503
dns_not_configured: este despliegue no puede publicar nombres en absoluto.
Un nombre del que no se ha sabido nada en treinta días se retira. Informar de una dirección, o pedir el certificado de abajo, cuenta como dar señales de vida. Un proveedor que está en marcha pide su certificado varias veces al día, y nunca está tan callado. Uno que vuelve tras un largo silencio simplemente vuelve a tener su registro creado.
Una limitación conocida. Algunos routers y servicios de filtrado DNS se niegan a responder cuando un nombre público apunta a una dirección privada. Se llama DNS rebinding protection, y cuando está activada, el nombre no se resuelve para nadie que esté detrás y el Stage no puede llegar hasta ti. No hay solución por nuestra parte. Muchos routers que tienen el ajuste permiten exceptuar un dominio, y letsdj.io es el que hay que exceptuar.
Un certificado
GET https://api.lets.dj/providers/certificate
Authorization: Bearer <sync token>
{
"hostname": "0123456789abcdef.letsdj.io",
"cert": "-----BEGIN CERTIFICATE-----\n…",
"key": "-----BEGIN PRIVATE KEY-----\n…",
"notAfter": 1798000000000
}
cert y key están en PEM. notAfter es cuándo caduca el certificado, en milisegundos desde la época. El certificado es para *.letsdj.io, así que cubre tu hostname en cualquier puerto, y todos los proveedores reciben el mismo certificado y la misma clave, junto con su propio hostname. La respuesta lleva Cache-Control: no-store.
Pídelo al arrancar, y luego de nuevo varias veces al día. Cambia a uno nuevo cuando se te dé, sin reiniciar, para que las renovaciones y cualquier reemisión forzada lleguen a un proveedor en marcha. Conserva en disco el último certificado válido, para que un proveedor que arranca sin red pueda seguir sirviendo hasta que caduque.
- 503
certificate_unavailableconRetry-After: 300: todavía no se ha emitido ninguno. Inténtalo de nuevo en unos minutos. - 503
secrets_unavailable: el servicio no puede leer sus secretos almacenados en este momento. - 403
unknown_sync_token, y 401missing_token.
Lo que no haremos
No distribuimos, incluimos, preinstalamos, avalamos, enlazamos ni recomendamos ningún proveedor de terceros. No es remilgo — Grokster trata la ausencia de salvaguardas como prueba de intención, y Filmspeler gira en torno a la preinstalación y la promoción. La distancia es lo que hace que la postura de herramienta neutral sea real y no meramente decorativa, y solo funciona si de verdad se mantiene.
Sí alojamos dos piezas de infraestructura, en las mismas condiciones para todos los proveedores. Un proveedor que tenga un token de sincronización puede pedirnos que publiquemos un nombre para su dirección (POST /providers/address, que se rechaza salvo que la dirección sea privada, link-local o carrier-grade NAT), y puede pedir el certificado compartido *.letsdj.io que permite a un navegador confiar en ese nombre (GET /providers/certificate). Ambas autentican un token de sincronización y no leen nada más.
Ninguna toca el contenido. El Stage recoge el contenido directamente del proveedor y nunca pasa por nosotros, y un catálogo son los metadatos que un proveedor decidió enviar, que ni revisamos ni seleccionamos. Un nombre y un certificado son lo que cualquier servicio web necesita para que un navegador pueda llegar a él.