У меня есть 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-адресам, но я не эксперт по безопасности, и есть некоторые тонкости, которые мне не хватает.