【问题标题】:Cloud Functions for Firebase - Knowing which user has written the data in onWriteCloud Functions for Firebase - 知道哪个用户在 onWrite 中写入了数据
【发布时间】:2017-10-24 02:40:48
【问题描述】:

我正在尝试制作一个简单的消息传递应用程序。在此过程中,为了安全起见,我想将firebase的云功能特性用于不应在客户端执行的功能。

我想在用户需要时调用的许多函数。我现在尝试这样做的方式是让客户端在单个父项下推送小的“函数请求”对象,以便 onWrite 函数将触发,我可以解析请求对象以执行该函数(我是不使用 http 函数是因为我想通过某种方式安全地知道是哪个用户发出了请求)。

问题是我在 firebase 的文档中找不到方法来知道是哪个用户编写了数据。

在 index.js 我有

exports.requestFunction = functions.database.ref('/function-
requests/{pushId}')
.onWrite(event => {
// Parse event.data.val() for things like the function name and its
// parameters. Then actually call the function.
// Ideally I would also be able to parse event somehow to find the user
// who saved the data.
});

请注意,我考虑过将用户 ID 作为参数包含在内,但这太不安全了,因为任何用户都可以通过提供不同的 uid 来伪装成另一个用户。

【问题讨论】:

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


    【解决方案1】:

    您可以编写一个Firebase Database Rule,只允许用户在特定字段中写入自己的用户ID,然后将其作为参数传递。

    例如

    "user": {
      ".validate": "newData.val() === auth.uid"
    },
    

    【讨论】:

      【解决方案2】:

      你有两个选择。首先,您可以使 UID 成为数据库写入路径的一部分,使用安全规则确保只有经过身份验证的规则才能写入该路径。考虑数据库触发器通配符路径"/commands/{uid}/{pushid}" 以及以下安全规则:

      "commands": {
          "$uid": {
              ".read": false,
              ".write": "$uid === auth.uid"
          }
      }
      

      只有经过身份验证的用户才能有效地写入 /commands/{uid} 下他们自己的数据库区域。您可以像这样在函数中获取匹配的 UID 通配符:const uid = event.params.uid

      考虑观看my talk at Google I/O 2017,我使用此策略构建回合制游戏。

      您也可以向数据库触发事件询问生成写入的 UID,如 this other question 中所述,尽管它没有记录(或支持)。

      【讨论】:

        【解决方案3】:

        首先你可以在here阅读更多关于安全规则的内容,(与其他链接“安全/数据库”不同)

        确保在要保存到数据库的数据中包含字段,例如"user_id",该字段将与auth.uid 一起检查是否相同。

        让你的数据库规则像这样:

        {
         "rules": {
           ".read": true,
           "function-requests": {
              "$pushId" :{
                  ".write": "newData.child('user_id').val() == auth.uid"
              }
            }
          }
        }
        

        之后,您可以放心地继续您的云功能

        【讨论】:

          猜你喜欢
          • 2017-08-26
          • 2017-08-25
          • 2017-11-12
          • 2017-09-01
          • 2017-11-10
          • 2018-10-11
          • 2017-10-27
          • 2018-05-02
          • 2017-10-26
          相关资源
          最近更新 更多