Mopidy: Отсутствует заголовок ответа CORS для статических файловых ресурсов

Созданный на 28 дек. 2020  ·  7Комментарии  ·  Источник: mopidy/mopidy

Опишите ошибку
В обработчике статических файлов плагина http отсутствуют дополнительные заголовки для Access-Control-Allow-* . Это уже правильно сделано для обработчика JSON-RPC.
Проблема в том, что из-за проблем с CORS невозможно получить статические ресурсы, даже если источник запроса внесен в белый список.

Как воспроизвести
Убедитесь, что используемый вами домен внесен в белый список конфигурации:

[http]
allowed_origins = localhost:8080

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

fetch('http://localhost:6080/local/feecccb956b1764b8245244611a61e15-600x600.jpeg')

Это даст ошибку следующего типа:

Access to fetch at 'http://localhost:6680/data/local/feecccb956b1764b8245244611a61e15-600x600.jpeg' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

Ожидаемое поведение
Запросы с перекрестным происхождением должны работать для статических ресурсов, если источник запроса внесен в белый список.

Среда
Пожалуйста, заполните следующую информацию:

  • Операционная система: 5.9.4-arch1-1
  • Запускаете Mopidy как сервис или в терминале? service
  • Ваша конфигурация (вывод sudo mopidyctl config ): команда не работает
  • Версии программного обеспечения (вывод sudo mopidyctl deps ): команда не работает

Дополнительный контекст
Я думаю, что проблему довольно легко решить, расширив функцию set_extra_headers () StaticFileHandler как это уже сделано здесь . Это верно?

C-bug A-http good first issue

Самый полезный комментарий

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

Все 7 Комментарий

К сожалению, заголовок Access-Control-Allow-Origin допускает только одно значение. Это становится немного сложнее, когда мы хотим поддерживать несколько значений из нашего настроенного списка:

Для ограничения возможных значений Access-Control-Allow-Origin набором разрешенных источников требуется код на стороне сервера для проверки значения заголовка запроса Origin, сравнения его со списком разрешенных источников, а затем, если значение Origin находится в список, чтобы установить значение Access-Control-Allow-Origin на то же значение, что и значение Origin.

И это даже хуже, потому что, насколько я понимаю, вы не можете полагаться на то, что они являются заголовком запроса Origin, если это не запрос CORS . И вы также не можете полагаться на наличие заголовка Referer ни для каких запросов HTTPS (который был бы альтернативным заголовком для использования). Это то, что привело к довольно сложному коду защиты CSRF, который гарантирует, что предполетный CORS танцует (примечание: я думаю, что с тех пор это изменилось, и все POST-сообщения браузера теперь получают заголовок Origin?). Сомневаюсь, что мы хотим этого здесь.

Поскольку StaticFileHandler имеет дело только с «безопасными» запросами GET, может быть, можно просто установить заголовок ответа «Access-Control-Allow-Origin: *»?

Если подумать об этом подробнее (несмотря на нежелание), можно с уверенностью сказать, что любой браузер, заинтересованный в соблюдении политики CORS, отправит заголовок Origin. Таким образом, мы можем просто условно выполнить check_origin() на основе установленного заголовка Origin, а затем, если разрешено, скопировать значение заголовка в заголовок ответа Access-Control-Allow-Origin, как обычно. Если нет заголовка Origin, наше поведение не изменится.

Думая об этом больше (несмотря на нежелание)

Мне жаль. :не вижу зла:


Итак, что же такого особенного в статических активах? Почему мы не можем просто повторно использовать всю уже существующую классную логику. Я имею в виду, что все проверки исходного заголовка и т. Д. Уже есть, если я не ошибаюсь. Разве мы не можем использовать его для условной установки заголовков? : мышление:

Только запросы GET и политика CORS не то же самое, что защита CRSF для «небезопасных» методов с побочными эффектами, такими как POST. Это разные проблемы, и их решение не одно и то же.

Но мы можем повторно использовать большую часть этого, да, это то, что я пытался сказать во втором сообщении.

Было ли мое последнее сообщение осмысленным? Вы хотите применить исправление, или я должен добавить его в список дел?

Да, это имеет смысл. : смайлик:

Было бы здорово, если бы вы могли добавить его в список. Хотя я смог заглянуть в код и понять, чего не хватает, у меня слишком мало знаний о структуре, которая здесь используется, и о том, о чем мне придется позаботиться. Извините. :не вижу зла:

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги