Firebase的云端function – 了解哪个用户在onWrite中写入了数据

我试图做一个简单的消息应用程序。 在这个过程中,为了安全起见,我想使用Firebase的云functionfunction,这些function不应该在客户端执行。

我希望在用户需要的时候调用许多函数。 现在我试图做的方式是通过让客户端在单个父项下推入一些“函数请求”对象,这样onWrite函数将会触发,我可以parsing请求对象来执行函数(我之所以不使用http函数是因为我想要某种方式来安全地知道哪个用户发出了请求)。

问题是我无法在firebase的文档中find一个方法来知道哪个用户写了数据。

在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来伪装成另一个用户。

您可以编写Firebase数据库规则 ,仅允许用户在特定字段中编写自己的用户标识,然后将其作为parameter passing。

恩。

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

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

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

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

考虑在2017年的Google I / O上观看我的演讲 ,我使用这个策略来构build一个回合制游戏。

您也可以向数据库触发器事件询问生成写入的UID,如另一个问题所述 ,尽pipe它没有logging(或支持)。

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

确保你要保存到数据库的数据包含字段,例如"user_id" ,这个字段将被auth.uid检查是否相同。

使你的数据库规则是这样的:

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

之后,你可以继续你的云function,而不用担心