如何拒绝管理员调用Firebase函数?

时间:2019-06-14 09:36:44

标签: android node.js firebase google-cloud-functions

我有两个firebase函数触发器:

  1. 用户onUpdate
  2. 所有者onUpdate

触发所有者onUpdate时,它将进行操作并更新用户文档。

最后一次操作而不是从客户端调用用户onUpdate。

是否可以拒绝管理员或服务器调用函数?

我在Firebase documentation上搜索,发现如果我使用:

console.log(context.auth.uid);

它将显示进行更改的用户ID,但出现此错误:

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,并且在调用该函数时已通过身份验证

编辑

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应用程序)调用函数,此后服务器将无限调用。

重要!

我不想再创建一个名为“ orders”的集合。因此,问题不在于我如何管理应用程序或如何管理用户与所有者之间的订单,因为我只需要知道如何区分通话即可。

1 个答案:

答案 0 :(得分:0)

这个问题没有真正的答案,但是我已经解决了。

更新文档时,如果任务成功,我将对Firebase Function进行HTTP调用,并同时更新所有者文档。我将所有Firestore触发器都转换为OnCall函数,因此没有递归。