Облачные функции Firebase - Как получить пользователя, который загружает файл? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть веб-сайт администратора, который загружает файлы в определенную папку в Firebase Storage.

В облачных функциях Storage мне нужно получить аутентифицированный userId от пользователя, который загружает файл.Мне это нужно, потому что, когда пользователь загружает файл, запускается облачная функция, выполняет некоторый процесс и сохраняет информацию в базе данных реального времени, где мне нужно сохранить ответственного пользователя действия загрузки.

IЯ видел, что получить пользователя из облачной функции базы данных реального времени просто (используя context.auth.uid), но я не нашел аналогичного решения для облачных функций хранилища.

Возможно ли это?

Tks.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я подумал, что предоставлю рабочий код, поскольку ответ Али Аббаса не совсем правильный.

Добавление пользовательских метаданных в файл во время загрузки.У вас есть для использования объекта customMetadata string> string, как показано ниже.

firebase.storage().ref("/location/path").put(file, {customMetadata: {'uid': firebase.auth().currentUser.uid}})

Далее нам нужно убедиться, что все загруженные файлы содержат эти метаданные и что они точные.Вот рабочее правило безопасности хранилища:

allow write: if request.resource.metadata.uid == request.auth.uid

Наконец, из облачной функции следующее вернет uid, взятый из метаданных файла:

object.metadata.uid

Вы можете быть уверены, что этоэто идентификатор пользователя, который загрузил файл, поскольку они не могут быть загружены без него, если вы не используете Admin SDK.

0 голосов
/ 11 декабря 2018

Вы можете загрузить собственные метаданные в виде объекта, содержащего свойства String:

Из документации здесь :

var metadata = {
  customMetadata: {
    'location': 'Yosemite, CA, USA',
    'activity': 'Hiking'
  }
}

Затем вы можете использовать getMetadata в файле(документ здесь ), чтобы получить его информацию или, например, получить customMetadata как в моей функции триггера ниже.

Например, и из моего приложения для iOS я создал StorageMetadata иЯ установил customMetadata на ["user":"userID_AZERRRRR"]

В функциях js моего узла я разработал функцию триггера следующим образом:

exports.testStorageOnFinalize = functions.storage.object().onFinalize(uploadedObject => {
    console.log('metadata keys', Object.keys(uploadedObject.metadata));
    console.log('metadata user', uploadedObject.metadata['user']);
})

В консоли журнала:

3: 00: 20.140 PM info testStorageOnFinalize пользователь метаданных userID_AZERRRRR

Риски

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

Итак, , чтобы разрешить это , мы можем использовать правила безопасности для хранения, чтобы проверить, равен ли пользователь идентифицированному пользователю:

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.user == request.auth.uid;

. Вы можетепроверить правила хранения здесь

...