Срок действия защищенных медиафайлов истекает

У одного из наших клиентов возникли проблемы с загрузкой защищённых медиафайлов.
Этот клиент использует Discourse на базе Docker (официальная установка) с включённой поддержкой AWS S3 и защищённых медиафайлов.

На форуме размещено несколько аудиофайлов форматов mp3 и m4a.

Discourse автоматически встраивает удобный плеер, например, как здесь:

image

Проблема: аудиофайлы работают ненадёжно. Иногда они не воспроизводятся.

Мне не удаётся воспроизвести проблему со 100% гарантией, возможно, из-за кэширования, но кажется, что загрузка файла откладывается до момента нажатия кнопки воспроизведения. Это звучит логично и правильно.

Однако это создаёт проблемы при использовании защищённых медиафайлов: если оставить страницу открытой на некоторое время и нажать кнопку воспроизведения через минуту или около того, аудиофайл не всегда воспроизводится. В этот момент AWS возвращает ошибку 403 Expired. Похоже, что запрос подписывается не в момент запроса файла, а раньше. Сообщение об ошибке явно указывает, что запрос истёк в прошлом.

Я подозреваю, что это связано с задержкой, но не уверен на 100%. Факт в том, что проблема возникает только с аудиофайлами (в отличие от встроенных изображений, которые всегда загружаются сразу).

Да, время на сервере установлено правильно.

Я могу воспроизвести проблему на чистой установке с последней бета-версией. Достаточно добавить два аудиофайла в тему и немного поиграть с ними.

2 лайка

Это может быть связано с тем, как браузеры работают с тегами аудио и видео и значением по умолчанию для атрибута preload. Являются ли файлы особенно длинными? Насколько мне известно, браузеры загружают данные по требованию, используя диапазоны байтов.

4 лайка

Нет, они не большие: файлы всего несколько ( < 5) мегабайт, и они не загружаются по диапазонам.

Что вы имеете в виду под «значение по умолчанию для preload»?

Если у вас есть тег <audio> или <video>, установка атрибута preload=auto подскажет браузеру загрузить весь файл при загрузке страницы, поэтому у вас не возникнет этой проблемы с истечением срока действия подписанного URL-адреса S3.

Как это часто бывает, сайты начали злоупотреблять этим атрибутом, и теперь он не всегда выполняется безоговорочно, но остаётся подсказкой, которую браузер учитывает.

6 лайков

Нет явного тега <audio>, он автоматически генерируется Discourse при вставке аудиофайла. Без атрибута preload.

То, что я не понимаю: если маршрут /secure-media-uploads генерирует подписанную ссылку, то почему имеет значение, сколько времени проходит между загрузкой страницы и обращением к маршруту? В конце концов, он генерирует подписанный маршрут и немедленно перенаправляет на него. Но каким-то образом это действительно имеет значение. Похоже, что что-то кэшируется или что-то в этом роде?

Он есть в сгенерированном HTML из разметки поста, и именно об этом я говорю. Считаю, что имеет смысл добавить этот атрибут, когда включена соответствующая настройка.

Я полагаю, что вся суть этой функции именно в этом. Получить URL-адреса для загрузок, которые нельзя распространять в других местах, и единственный способ сделать это — использовать истекающие URL-адреса.

5 лайков

Да, я это понимаю. И таймер истечения начинает отсчитываться в момент вызова маршрута /secure-media-uploads, а не при загрузке страницы.

Тем не менее, кажется, имеет значение, насколько давно была загружена страница до вызова маршрута. И тогда что-то ломается, каким-то образом. Я просто не понимаю, почему это происходит.

Это уже исправлено здесь: FIX: Disable preloading audio + video when secure media enabled (#8922) · discourse/discourse@7ff58f1 · GitHub, @RGJ. Проблема возникала из-за того, что браузеры отправляют первоначальный запрос к аудио- и видеофайлам для получения метаданных (например, длительности). Однако из-за защищённой подписанной URL-адреса этот начальный запрос запускал обратный отсчёт 15-секундного срока действия, и когда пользователи пытались воспроизвести аудио или видео после истечения этого времени, мы получали ошибку 403 от AWS.

Теперь при включённом безопасном медиа-контенте предварительная загрузка для видео и аудио отключена. Существующие сообщения с аудио и видео потребуют перестройки их HTML, чтобы изменения вступили в силу.

13 лайков