如何从firebase而不是从Android进行geofire查询



我正在尝试查询位置数据库geofire,但不希望从客户端完全打开查询。

如果我允许Android客户端指定点和半径(如这里所指定的(,我就打开了一个安全漏洞应用程序,让任何用户都可以进行任何查询。

防止这种情况的一种方法是服务器端查询(即客户端没有指定半径(。但是,如何使用无服务器的firebase架构来实现这一点呢?

有其他保护查询数据的想法吗?谢谢

如果你想在一个可信的环境中运行代码,而不需要启动服务器,你可以看看Cloud Functions或Cloud run,它们都有来自Firebase的集成。


也就是说,我会考虑你要防范的安全风险是什么。

Firebase实时数据库上推荐的GeoFire数据结构将每个被跟踪密钥的地理数据与其他数据分离,其结构如下:

"_geodata": {
"sf-muni:1040":{"g":"9q8yyhxbe5","l":[37.773846,-122.420868]},
"sf-muni:1050":{"g":"9q8zn6egkz","l":[37.807301,-122.415298]},
"sf-muni:8946": {"g":"9q8ympvrg3","l":[37.705044,-122.468231]},
...
},
"sf-muni": {
"vehicles": {
"1040": {"dirTag":"F____I_F00","heading":45,"id":1040,"lat":37.773846,"lon":-122.420868,"predictable":true,"routeTag":"F","secsSinceReport":6,"speedKmHr":11,"timestamp":1637368646567,"vtype":"train"},
"1050": {"heading":75,"id":1050,"lat":37.807301,"lon":-122.415298,"predictable":true,"routeTag":"F","secsSinceReport":3,"speedKmHr":31,"timestamp":1637368659567,"vtype":"train"},
"8946": {"dirTag":"28___O_F00","heading":88,"id":8946,"lat":37.705044,"lon":-122.468231,"predictable":true,"routeTag":"28","secsSinceReport":2,"speedKmHr":0,"timestamp":1637368660567,"vtype":"bus"}
...
}
}

因此,_geodata节点只为每个位置存储一个应用程序定义的密钥,这是所有用户都必须可读的唯一数据结构(因为您无法查询无法读取的数据(。要查找每个键的实际数据,需要在此数据模型中进行额外查找,可以然后拥有自己的安全规则。

只有当您使用数据事件(我建议您不要使用(时,您才能将这两种类型的数据连接起来,从而为这两种数据提供一组单独的安全规则。

最新更新