Как сделать аутентифицированные, производительные запросы на изображения - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть API с аутентификацией токена, который обслуживает изображения. Указанные c изображений, которые будут обслуживаться, выбираются динамически в зависимости от действий пользователя (например, файловый браузер). Я пытаюсь выяснить, как заполнить HTML изображения аутентифицированными запросами.

  • Вставка токена в URI - плохая идея, потому что его легко просочиться.

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

То, что я пробовал

Первым делом я попытался извлечь изображения вручную (установив токен в заголовке), затем установив атрибуты src, используя URL.createObjectURL. Это работает, но производительность сильно снижается из-за всех предварительных запросов CORS.

Моя следующая идея состояла в том, чтобы обойти CORS с помощью запросов POST с типом контента, установленным на text/plain, хотя на самом деле это JSON с токен включен. Это избавляет от CORS, делая его «Простым запросом» . Но это также открывает дыру в безопасности, которую нужно подключить к серверу, гарантируя, что POST+text/plain запросы никогда не будут выполнять никаких действий мутации (ни то, ни другое, или куки не должны использоваться вообще).

Это избавилось от предварительные проверки, но теперь у меня есть другая проблема с производительностью: браузер не кэширует POST-запросы, по веским причинам.

Так что есть простой способ достичь аутентифицированных GET-запросов, которые выполняются (кэшируются и не содержат CORS) ?

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

(более сложные) идеи, которые я еще не пробовал

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

  • У меня была еще одна идея, что токен можно использовать в качестве общего секрета для подписи каждого запроса (вероятно, URI). Подпись будет включена в запрос URI. Это открывает доступ к указанным c запрашиваемым ресурсам, но не к самому токену, в то же время связывая действительность URL-адресов запроса с жизненным циклом токена. С точки зрения безопасности это кажется эквивалентным заранее заданным URL-адресам, но я не эксперт по безопасности, и есть некоторые тонкости, которые мне не хватает.

...