Функция Firebase (node.js) для возврата URL-адреса загрузки (через имя файла) из хранилища

HixField спросил: 12 мая 2018 в 04:28 в: firebase

Как написать функцию HTTP Firebase, которая возвращает URL-адрес (в обычном тексте), где можно загрузить изображение?

Я использую последнюю версию Firebase Admin SDK. У меня есть файл под названием в ящике по умолчанию, для которого я хотел бы вернуть URL-адрес через HTTP-вызов, я придумал этот код:

exports.getImageUrl = functions.https.onRequest((request, response) => {
  return firebase.storage().bucket().file("images/thumbnail.png").getSignedUrl({
    action: 'read',
    expires: '03-09-2491'
  })
  .then(signedUrls => {
    return response.send(signedUrls[0])
  })
  .catch(error => {
    return response.status(500).send(error)
  })
})

, но это не удается:

callback is not a function
    at /user_code/node_modules/firebase-admin/node_modules/@google-cloud/storage/src/file.js:1784:7
    at Request._callback (/user_code/node_modules/firebase-admin/node_modules/google-auto-auth/index.js:362:9)

Что я делаю неправильно?

EDIT

Я добавил подробные записи:

exports.getImage = functions.https.onRequest((request, response) => {
  console.log("start")
  const storage = firebase.storage()
  console.log(storage)
  const bucket = storage.bucket()
  console.log(bucket)
  const file = bucket.file("buildInExercises/bb_4zigzagcushionblue_thumbnail.png")
  console.log(file)
  return file.getSignedUrl({
    action: 'read',
    expires: '03-09-2491'    
  })
  .then(urls => {
    return response.send(urls)
  })
  .catch(error => {
    return response.status(500).send(error)
  })
})

Теперь я получаю правильный ответ:

{
  "message": "Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/snookercoachapp-dev/serviceAccounts/snookercoachapp-dev@appspot.gserviceaccount.com."
}

У меня есть проблема с разрешением?


1 ответ

Есть решение
Doug Stevenson ответил: 13 мая 2018 в 06:57

Сообщение об ошибке является симптомом лица, что getSignedUrl() работает только при инициализации SDK администратора с учетной записью службы. Это означает, что вы не можете зависеть от учетных данных по умолчанию, которые используются при вызове admin.initializeApp() без аргументов.

HixField ответил: 13 мая 2018 в 07:24
да, я понял это. Печально, что информация так распространена в Интернете. Документация Firebase нуждается в некоторой работе ...
Doug Stevenson ответил: 13 мая 2018 в 07:26
На самом деле это не проблема Firebase. Firebase Admin SDK фактически просто обертывает Cloud Storage SDK, что делает его в первую очередь облачным продуктом. Документация Cloud в какой-то степени обсуждает подписанные URL-адреса, но эта информация должна быть сопоставлена ​​с опытом Firebase.
HixField ответил: 13 мая 2018 в 07:26
Я только что вернул свой первый URL-адрес, но заметил, что он действительно очень длинный и содержит некоторые ключи, такие как "GoogleAccessId" и прочее. Является ли этот URL безопасным для использования публично?
HixField ответил: 13 мая 2018 в 07:52
хорошо, это хорошая новость!
Doug Stevenson ответил: 13 мая 2018 в 07:51
Да, эти URL-адреса предназначены для общественного потребления. В них нет личных данных.