Firestore-облачные функции-Get uid

я пытаюсь получить UID пользователя, аутентифицированного firebase Web sdk, в облачной функции. Функции облака инициируется onWrite событие cloud firestore.

эта функция запускается, когда вошедший в систему пользователь создает/обновляет элементы в кафе. Аутентификация обрабатывается Firebase Auth. Правила безопасности разрешают запись только для зарегистрированных пользователей. Таким образом, это событие может быть связано с пользователем.

export const cfun = functions.firestore.document('cafes/{cafeId}/items/{itemId}').onWrite(async event => {
  // trying to get the uid here
})

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

это похоже на общий случай для архитектуры без сервера.

#

Update: функции, запускаемые firestore, не имеют event.auth заполняется. Поиск предложений по моделированию следующее требование.

в модели данных, у меня есть кафе и владельцы. Каждое кафе может принадлежать многим владельцам, и кафе может быть передано другому владельцу на более позднем этапе. Таким образом, кафе моделируются как /cafes/{cafeId} и все, что принадлежит кафе as /cafes/{cafeId}/items/{itemId} etc. Нам также нужно запросить кафе на основе разных параметров, если смоделировано ниже пользователей, это становится сложным. По этим причинам кафе не может быть смоделировано как /users/{userId}/cafes/{cafeId}.

что касается безопасности правила обеспокоены, я мог бы контролировать доступ к записи с помощью get(<>) чтобы определить, кто получает доступ к кафе. С безопасностью проблем нет.

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

если event.auth не предусмотрено в функции, то это ограничение заставит элементы, которые не принадлежат пользователям быть по образцу /users/{userId}/<item_name>/{itemId} просто для доступа к идентификатору пользователя в облачных функциях. Это неестественно.

также прямо сейчас нет способа выяснить, запускается ли облачная функция из-за изменений, выполняемых в консоли. The event.auth информация, доступная для функций, запускаемых базой данных firebase, идеально подходит для обработки всех случаев.

любые предложения относительно того, как реконструировать этот случай, оцениваются как что ж.

#

заранее спасибо,

2 ответов


Так как облачные функции 1.0 вы можете получить UID, как это

exports.dbCreate = functions.database.ref('/path').onCreate((snap, context) => {
  const uid = context.auth.uid;
  const authVar = context.auth; 
});

вот хороший пост от команды FB для всех CF1.0 изменений: https://firebase.google.com/docs/functions/beta-v1-diff#event_parameter_split_into_data_and_context

данные context.auth можно найти здесь:https://firebase.google.com/docs/firestore/reference/security/#properties


я столкнулся с аналогичной проблемой. В Firebase это было легко - вы просто взяли данные из event.автор. Я бы предположил, что это просто функция, еще не реализованная, пока мы находимся в бета-фазе Firestore. Добавление идентификатора пользователя в путь не работает, как вы упоминали ранее, поскольку он будет постоянно меняться в зависимости от пользователя, делающего обновление.

мой сценарий заключается в том, что я хочу создать поле "lastUpdatedBy" в обновляемом объекте. Если мы позволим ... клиент для отправки в поле lastUpdatedBy в полезной нагрузке это может быть злоупотреблено клиентом-изгоем (т. е. кем-то с аутентифицированной учетной записью), пытающимся выдать себя за кого-то другого. Поэтому в Firebase мы полагались на облачную функцию для заполнения этого поля событиями изменения данных.

мой обходной путь-позволить клиенту вставить поле "lastUpdatedBy", но дополнительно использовать правила Firestore для проверки того, что идентификатор пользователя в полезной нагрузке совпадает с именем зарегистрированного пользователя-в противном случае отклонить запрос на запись.

что-то типа:

match /collectionA/{docId} {
  allow update: if request.resource.data.lastUpdatedBy == request.auth.uid;
}

пока ребята Google / Firestore не добавят объект "auth" в облачную функцию, я не вижу другого обходного пути, но хотел бы услышать по-другому.