CORS GET запрашивает подписанные URL-адреса Google Storage - PullRequest
0 голосов
/ 03 ноября 2019

(я видел похожие вопросы по поводу проблем с использованием запросов CORS для подписанных URL-адресов в облачном хранилище Google, но только для запросов PUT. Так что, надеюсь, это не дубликат.)

Iу меня есть работник сервиса, где я хочу кэшировать запросы к изображениям, хранящимся в облачном хранилище Google. У меня есть общедоступные изображения, на которые ссылаются с помощью медиа-изображения общедоступных файлов, и личные файлы, к которым обращаются с помощью подписанных URL-адресов, для которых задана дата истечения срока давности в будущем. (Безопасность заключается в том, что эти подписанные URL трудно угадать.)

if (isPublic) {
  return file.makePublic()
    .then(() => file.getMetadata())
    .then(meta => meta[0].mediaLink)
} else {
  return file.makePrivate()
    .then(() => file.getSignedUrl({ action: 'read', expires: '03-10-3000' }))
    .then(data => data[0])
}

Так что URL-адреса моих изображений выглядят так:

<!-- Public File, Media URL -->
<img src="https://storage.googleapis.com/download/storage/v1/b/BUCKETNAME.appspot.com/o/ENCODEDFILEID?generation=1571160489057644&alt=media"/>

<!-- Private File, Signed URL (v2 signing) -->
<img src="https://storage.googleapis.com/BUCKETNAME.appspot.com/ENCODEDFILEID?GoogleAccessId=BUCKETNAME%40appspot.gserviceaccount.com&Expires=32509555200&Signature=SIGNATURE" />

Эти два тега изображения работают очень хорошо вHTML-файл, как они стоят. Проблема возникает, когда я хочу кэшировать их с помощью сервисного работника. Поскольку это перекрестный запрос, запросы возвращаются к ПО как OPAQUE, и поэтому он не может их безопасно кэшировать, так как ПО не может видеть код состояния и, следовательно, не знает, был ли это успешный запрос. или нет. (и я не смею кешировать непрозрачные запросы)

// SW.js
/* This 'works' in that it doesn't break the images, but it doesn't cache anything */
importScripts('https://cdn.jsdelivr.net/npm/workbox-cdn@4.3.1/workbox/workbox-sw.js')
const cacheFirstStrategy = new workbox.strategies.CacheFirst()
workbox.routing.registerRoute(new RegExp('^https://storage\\.googleapis\\.com'), cacheFirstStrategy)

Поэтому я попытался следовать инструкциям по Настройка совместного использования ресурсов между источниками (CORS) , чтобы добавить CORS в мое ведро. Вот что я установил:

$ gsutil cors get gs://BUCKET.appspot.com
[{"maxAgeSeconds": 3600, "method": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], "origin": ["https://MY-DOMAIN/"], "responseHeader": ["Content-Type", "Authorization", "Content-Length", "User-Agent", "x-goog-resumable"]}]

И действительно, с этими настройками я могу изменить SW.js на следующее:

// SW.js
/* This caches public URLS, but completely breaks Signed URLs */
importScripts('https://cdn.jsdelivr.net/npm/workbox-cdn@4.3.1/workbox/workbox-sw.js')
const cacheFirstStrategy = new workbox.strategies.CacheFirst()
const cacheFirstWithCorsStrategy = ({ event }) => {
    const request = new Request(event.request, { mode: 'cors' })
    return cacheFirstStrategy.makeRequest({ request, event })
}
workbox.routing.registerRoute(new RegExp('^https://storage\\.googleapis\\.com'), cacheFirstWithCorsStrategy )

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

Access to fetch at 'https://storage.googleapis.com/BUCKET.appspot.com/ENCODEDFILEID?GoogleAccessId=BUCKET%40appspot.gserviceaccount.com&Expires=32509555200&Signature=SIGNATURE' 
from origin 'https://MU-DOMAIN' has been blocked by CORS policy: 
The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'.

Итак ... Спасибо, что прочитали все это. Теперь мои вопросы:

  1. Можно ли настроить CORS для запросов GET для URL-адресов со знаком хранения Google?
  2. Если это невозможно, есть ли другой способ созданияугадать URL доступа к частным файлам Google Storage, кроме подписанных URL? (Я пытался использовать веб-API Firebase Storage для получения URL-адреса для загрузки, но этот API не работает в Service Workers .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...