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" в облачную функцию, я не вижу другого обходного пути, но хотел бы услышать по-другому.