Как я могу запретить администратору вызывать функции Firebase? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть два триггера функции firebase:

  1. пользователь onUpdate
  2. владелец onUpdate

Когда запускается владелец onUpdate, он выполняет операцию и обновляет документ пользователя.

Пользователь onUpdate вызывается последней операцией, а не клиентом.

Есть ли способ запретить администратору или серверу вызывать функцию?

Я ищу в Документацию Firebase и обнаруживаю, что если я использую:

console.log(context.auth.uid);

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

Cannot read property 'uid' of undefined

Итак, я попытался напечатать контекстный объект, и вот результат:

context : { eventId: '7eac4df1-85bd-47dd-b83a-827b63597e10-0',
 eventType: 'google.firestore.document.update',
 notSupported: {},
 params: 
  { serviceId: 'bY0RjOSgygnXuojmDyng',
    userId: 'Poz0UKIShnSUJNPCrug3zvfiyKn1' },
  resource: 
   { service: 'firestore.googleapis.com',
    name: 'projects/*Project name*/databases/(default)/documents/users/Poz0UKIShnSUJNPCrug3zvfiyKn1/services/bY0RjOSgygnXuojmDyng' },
 timestamp: '2019-06-14T06:33:48.525983Z' }

Итак, мой ответ: есть ли функция, которая возвращает true / false, если сделан вызов с сервера или клиентского приложения?

Я использую Google Auth, и когда я вызываю функцию, я аутентифицируюсь

EDIT

UserCode Android

Пользователь удаляет заказ. (Для политики GDPR я не могу удалить его, но мне нужно сделать его невидимым с отмененным атрибутом)

FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("users").document(User.getUserId())
            .collection("orders").document(orderId)
                .update("canceled", true);

Функция UserCode Firebase

exports.updateLocalOrder = functions.firestore
    .document('users/{userId}/orders/{orderId}')
    .onUpdate((change, context) => {

      const order = change.after.data();
      const orderId = ontext.params.orderId;
      const ownerId = order.ownerId;

      if (order.canceled){

          admin.firestore().collection("owners")
              .doc(ownerId).collection("orders")
                  .doc(orderId).update("canceled", true);

      }

      ...
});

OwnerCode Android

Владелец удалил заказ. (Для политики GDPR я не могу удалить его, но мне нужно сделать его невидимым с отмененным атрибутом)

FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("owners").document(Owner.getOwnerId())
            .collection("orders").document(orderId)
                .update("canceled", true);

Функция OwnerCode Firebase

exports.updateUserOrder = functions.firestore
    .document('owners/{ownerId}/orders/{orderId}')
    .onUpdate((change, context) => {

      const order = change.after.data();
      const orderId = ontext.params.orderId;
      const userId = order.userId;

      if (order.canceled){

          admin.firestore().collection("users")
              .doc(userId).collection("orders")
                  .doc(orderId).update("canceled", true);

      }

      ...
}); 

Так что каждый раз, когда я удаляю заказ, будет происходить вызов функций из клиента (приложение для Android), а после этого будет бесконечный вызов с сервера.

ВАЖНО !!!

Я не хочу делать еще одну коллекцию под названием "заказы". Таким образом, проблема не в том, как я могу управлять своими приложениями или как я могу управлять заказами между пользователем и владельцем, потому что мне нужно только знать, как я могу различать звонки.

1 Ответ

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

Реального ответа на эту проблему нет, но я решил ее.

Когда я обновляю документ, если задача выполнена успешно, я делаю HTTP-вызов в Firebase Function и обновляю также владельцадокумент.Я преобразовал все триггеры Firestore в функции OnCall, чтобы не было рекурсии.

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