我在firebase中创建了一个简单的数据库,用于备份Android应用程序中的数据,并具有以下结构:
-item
-owner_id
-property1
-property2
...
-subitem
-more properties
已经是它了。但现在我想添加一个选项来创建一个链接,就像你可以在google drive或dropbox中一样,它允许每个拥有该链接的人查看数据。 (无需登录)。
所以我想,我会为每个项目创建一个密码/密钥,这些密码/密钥将包含在链接中并允许用户访问该项目,即使没有登录也是如此。但我很难找到一个解决方案,通过firebase的访问规则可以实现,因为我不希望每个项目都是公开可读的。 是否有任何选项可以执行此操作没有自定义令牌由单独的服务器创建
答案 0 :(得分:1)
我可以想到两个相当简单的方法:
第一种方法要求您设置服务器或实现接收用户请求的Cloud Functions HTTPS端点,验证链接中的密码/密钥,然后查找并返回所有签出的数据。
这看起来非常简单,但它确实意味着您要添加服务器端代码,这是我从不喜欢的。这就是为什么我总是寻找一种可以保留在Firebase数据库中的方法。
Firebase实时数据库具有REST API,您可以在其中直接访问特定点的数据。例如。 https://yours.firebaseio.com/items/item1.json
此REST API仍遵循您对数据库的安全规则,因此您需要authenticate the URL with an access token或将其公开访问。由于生成代币是相当复杂的,所以我在这里采用后者。
要意识到的是,在这种情况下,我们无法将电子邮件/密码/令牌传递给REST API。但我们可以做的是将数据放在不可思议的路径上。我们使用https://yours.firebaseio.com/items/item1.json?token=verysecrettoken
代替https://yours.firebaseio.com/public/verysecrettoken/item1.json
而不是public
。在后者中,我将公共数据放在顶级/public
节点下,这样可以更容易保护。请确保不要让整个https://yours.firebaseio.com/public.json
节点可读,因为有人可以{
"rules": {
"public": {
"$secret": {
".read": true
}
}
}
}
来获取所有节点。你更有可能做类似的事情:
$secret
使用此结构只有知道有效str(4)
值的人才能读取相应的数据。