我正在试着做一个简单的消息应用程序。在这个过程中,为了安全起见,我想使用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来伪装成另一个用户。
发布于 2017-05-24 08:39:54
您可以编写一个只允许用户在特定字段中写入自己的用户id的Firebase Database Rule,然后将其作为参数传递。
例如。
"user": {
".validate": "newData.val() === auth.uid"
},发布于 2017-05-24 12:16:44
你有两个选择。首先,您可以使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中所述,尽管它没有文档(或支持)。
发布于 2017-05-24 12:45:15
首先,您可以阅读有关here中安全规则的更多信息(与其他链接“安全/数据库”不同)
确保在您要保存到数据库中的数据包含字段中,例如"user_id",将使用auth.uid检查此字段是否相同。
将您的数据库规则设置为:
{
"rules": {
".read": true,
"function-requests": {
"$pushId" :{
".write": "newData.child('user_id').val() == auth.uid"
}
}
}
}在此之后,您可以毫无顾虑地继续您的云功能
https://stackoverflow.com/questions/44146753
复制相似问题