【问题标题】:How to create a public share-link for private resources in firebase database如何在 Firebase 数据库中为私有资源创建公共共享链接
【发布时间】:2017-10-01 15:11:12
【问题描述】:

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

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

已经是这样了。但是现在我想添加一个选项来创建一个链接,就像你可以在 google drive 或 dropbox 中那样,让每个知道链接的人都可以看到数据。 (无需登录)。

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

【问题讨论】:

    标签: firebase firebase-realtime-database nosql


    【解决方案1】:

    我可以在这里想到两种相当简单的方法:

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

    设置处理需求的端点

    第一种方法要求您设置一个服务器或实现一个 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/public/verysecrettoken/item1.json,而不是https://yours.firebaseio.com/items/item1.json?token=verysecrettoken。在后者中,我将公共数据放在顶级public 节点下,这样更容易保护。请确保不要使整个 /public 节点可读,因为这样有人可以 https://yours.firebaseio.com/public.json 获取所有信息。您更有可能会执行以下操作:

    {
      "rules": {
        "public": {
          "$secret": {
            ".read": true
          }
        }
      }
    }
    

    使用这种结构,只有知道有效$secret 值的人才能读取相应的数据。

    【讨论】:

    • 啊,我明白了,首先非常感谢您的广泛回复。我也想到了“不可猜测的路径”,但我不知道我可以将更高级别的路径设为私有,以防止用户只查看所有子目录!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2016-09-24
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多