如何为firebase数据库中的私有资源创建公共共享链接

时间:2017-10-01 15:11:13

标签: firebase firebase-realtime-database nosql

我在firebase中创建了一个简单的数据库,用于备份Android应用程序中的数据,并具有以下结构:

-item
  -owner_id
  -property1
  -property2
  ...
  -subitem
    -more properties

已经是它了。但现在我想添加一个选项来创建一个链接,就像你可以在google drive或dropbox中一样,它允许每个拥有该链接的人查看数据。 (无需登录)。

所以我想,我会为每个项目创建一个密码/密钥,这些密码/密钥将包含在链接中并允许用户访问该项目,即使没有登录也是如此。但我很难找到一个解决方案,通过firebase的访问规则可以实现,因为我不希望每个项目都是公开可读的。 是否有任何选项可以执行此操作没有自定义令牌由单独的服务器创建

1 个答案:

答案 0 :(得分:1)

我可以想到两个相当简单的方法:

  1. 设置处理要求的端点。
  2. 通过Firebase数据库的REST API处理需求。
  3. 设置处理要求的端点

    第一种方法要求您设置服务器或实现接收用户请求的Cloud Functions HTTPS端点,验证链接中的密码/密钥,然后查找并返回所有签出的数据。

    这看起来非常简单,但它确实意味着您要添加服务器端代码,这是我从不喜欢的。这就是为什么我总是寻找一种可以保留在Firebase数据库中的方法。

    通过Firebase数据库的REST API处理需求。

    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)值的人才能读取相应的数据。