【问题标题】:Using NodeJs with Firebase - Security将 NodeJs 与 Firebase 一起使用 - 安全性
【发布时间】:2013-01-18 09:30:46
【问题描述】:

由于需要做一些服务器端代码 - 主要是发送电子邮件,我决定使用 Nodejs 和 Express 作为服务器端元素以及 Firebase 来保存数据 - 部分来自学习经验。

我的问题是,在使用 Simple Email & Password API 进行身份验证时,使用客户端 Firebase 库和 Nodejs 库的最佳方法是什么。如果我在客户端进行身份验证,然后在 NodeJS 端调用不同的路由,则该用户的身份验证将在请求中进行。在 Node 中验证用户的测试方法是什么。

我假设的一种方法是从 firebase 获取当前用户的用户名和密码,然后将它们发布到 NodeJS,然后使用服务器上的 firebase 安全 API 进行测试。

【问题讨论】:

    标签: node.js firebase


    【解决方案1】:

    本质上,这里的问题是您需要安全地向您的 NodeJS 服务器传达客户端已通过 Firebase 身份验证的身份。有几种方法可以解决这个问题,但最简单的可能是让所有客户端NodeJS 通信都通过 Firebase 本身。

    因此,与其让客户端访问您的 NodeJS 服务器提供的 REST 端点,不如让客户端写入您的 NodeJS 服务器正在监控的 Firebase 位置。然后您可以使用 Firebase 安全规则来验证客户端写入的数据,并且您的服务器可以信任它。

    例如,如果您想让用户可以通过您的应用程序发送任意电子邮件(您的 NodeJS 服务器负责实际发送电子邮件),您可以有一个 /emails_to_send 位置,其规则如下:

    {
      "rules": {
        "emails_to_send": {
          "$id": {
            ".write": "!data.exists() && newData.child('from').val() == auth.email",
            ".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])"
          }
        }
      }
    }
    

    然后在客户端你可以这样做:

    ref.child('emails_to_send').push({
      from: 'my_email@foo.com', 
      to: 'joe@example.com', 
      subject: 'hi', 
      body: 'Hey, how\'s it going?'
    });
    

    在您的 NodeJS 代码中,您可以使用 Firebase 机密调用 .auth()(这样您就可以读取和写入所有内容),然后执行以下操作:

    ref.child('emails_to_send').on('child_added', function(emailSnap) {
      var email = emailSnap.val();
      sendEmailHelper(email.from, email.to, email.subject, email.body);
    
      // Remove it now that we've processed it.
      emailSnap.ref().remove();
    });
    

    这将是最简单也是最正确的解决方案。例如,如果用户通过 Firebase 注销,他们将无法再写入 Firebase,因此他们将无法再让您的 NodeJS 服务器发送电子邮件,这很可能是您想要的行为。这也意味着如果您的服务器暂时关闭,当您启动它备份时,它会“赶上”发送电子邮件,一切都会继续工作。

    【讨论】:

    • 这是很好的建议 - 谢谢。也许可以扩展 firebase 文档以包含此类架构建议。
    • 这样,电子邮件发送的错误处理也应该通过 Firebase 完成...仅供参考
    • 另请参阅firebase-queue,它为消费者(客户端和特权服务器)之间的这种传送提供了一个很好的策略
    • 在这种情况下,发送电子邮件的节点服务器是否需要 SSL。还是标准的 http 就足够了?
    【解决方案2】:

    以上似乎是一种迂回的做事方式,我会使用https://www.npmjs.com/package/connect-session-firebase之类的东西并以firebase为模型,通过express处理所有路由。如果您的 express 服务器正在呈现模板,而不仅仅是作为 JSON API 表现,则更容易。

    【讨论】:

      猜你喜欢
      • 2022-10-21
      • 2012-12-14
      • 2015-05-01
      • 1970-01-01
      • 2012-07-26
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      相关资源
      最近更新 更多