Las cargas de medios seguros caducan

Tenemos un cliente con problemas en la carga de archivos multimedia seguros.
Este cliente está ejecutando una instalación oficial de Discourse basada en Docker con AWS S3 y la carga de archivos multimedia seguros habilitada.

El foro contiene varios archivos de sonido mp3 y m4a.

Discourse incrusta automáticamente un reproductor agradable como este:

image

Problema: los archivos de sonido no funcionan de manera fiable. A veces no se reproducen.

No puedo reproducir esto al 100 % de forma fiable; creo que es debido a la caché, pero parece que la descarga se pospone hasta que se pulsa el botón de reproducción. Eso suena lógico y bien.

Sin embargo, no funciona bien con las cargas de archivos multimedia seguros: si dejas una página abierta durante un tiempo y pulsas el botón de reproducción después de un minuto o más, el archivo de sonido no se reproduce (siempre). En ese momento, AWS devuelve un error 403 Expired. Parece que la solicitud no se firma en el momento en que se solicita el archivo, sino antes. El mensaje de error indica claramente que la solicitud expiró en el pasado.

Sospecho que esto tiene que ver con el retraso, pero no estoy 100 % seguro. El hecho es que esto solo ocurre con archivos de sonido (es decir, no con imágenes incrustadas, que siempre se descargan inmediatamente).

Sí, la hora del servidor es correcta.

Puedo reproducirlo en una instalación nueva con la última versión beta. Solo hay que poner dos archivos de sonido en un tema y jugar un poco.

2 Me gusta

Eso puede deberse a cómo los navegadores manejan las etiquetas de audio y video y al valor predeterminado de preload. ¿Son los archivos especialmente largos? Según tengo entendido, los navegadores descargan usando rangos de bytes bajo demanda.

4 Me gusta

No, no son largos; los archivos son solo unos pocos ( < 5) megabytes y no se están descargando por rangos.

¿Qué quieres decir con ‘el valor predeterminado de preload’?

[quote=“RGJ, publicación:3, tema:140894”]
¿Qué quieres decir con ‘el valor predeterminado de preload’?[/quote]

Si tienes una etiqueta <audio> o <video>, establecer un atributo de preload=auto en ella le indicará al navegador que la descargue por completo al cargar la página, por lo que no tendrías este problema con la expiración de la URL firmada de S3.

Como suele ocurrir con estas cosas, los sitios comenzaron a abusar de este atributo y ya no se sigue ciegamente, pero sigue siendo una sugerencia que el navegador tendrá en cuenta.

6 Me gusta

No hay una etiqueta <audio> explícita; esta se genera automáticamente por Discourse cuando se inserta el archivo de audio. Sin un atributo preload.

La parte que no entiendo: si la ruta /secure-media-uploads está generando la URL firmada, ¿por qué importa cuánto tiempo pasa entre la carga de la página y el acceso a la ruta? Después de todo, genera la ruta firmada y luego inmediatamente redirige a ella. Pero de alguna manera, parece importar. Parece que algo se está almacenando en caché o algo así.

Sí la hay en el HTML generado a partir del markdown del mensaje, y es de eso de lo que estoy hablando. Diría que tiene sentido añadir ese atributo cuando la configuración está habilitada.

Creo que todo el punto de la característica es exactamente eso. Tener URLs que no se puedan compartir en otros lugares para las subidas, y la única forma de lograrlo es usando URLs que caducan.

5 Me gusta

Sí, lo entiendo. Y el temporizador de caducidad comienza a contar en el momento en que se llama a la ruta /secure-media-uploads, no cuando se carga la página.

Aún así, parece importar si la página se cargó mucho antes de que se acceda a la ruta. Y entonces falla, de alguna manera. Simplemente no entiendo por qué está ocurriendo esto.

Esto ya se ha solucionado aquí FIX: Disable preloading audio + video when secure media enabled (#8922) · discourse/discourse@7ff58f1 · GitHub @RGJ. El problema ocurría porque los navegadores envían una solicitud inicial a los archivos de audio y video para obtener metadatos del archivo, como la duración. Sin embargo, debido a la URL firmada segura, esta solicitud inicial iniciaba la cuenta regresiva de caducidad de 15 segundos, por lo que cuando los usuarios intentaban reproducir audio y video después de ese período, recibíamos el error 403 de AWS.

Ahora desactivamos la precarga de video y audio cuando los medios seguros están habilitados. Las publicaciones existentes con audio y video deberán regenerar su HTML para ver el cambio.

13 Me gusta