首页 文章

将NodeJ与Firebase一起使用 - 安全性

提问于
浏览
40

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

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

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

2 回答

  • 56

    基本上这里的问题是你需要安全地传达给你的NodeJS服务器谁客户端已经过Firebase认证 . 有几种方法可以解决这个问题,但最简单的方法可能就是让所有客户端< - > NodeJS通信都通过Firebase本身 .

    因此,不要让客户端访问由NodeJS服务器提供服务的REST endpoints ,而是让客户端写入您的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 Secret调用.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服务器发送电子邮件,这很可能是您想要的行为 . 这也意味着如果您的服务器暂时关闭,当您重新启动它时,它将“赶上”发送电子邮件,一切都将继续有效 .

  • 1

    以上看起来像是一种迂回的做事方式,我会使用像https://www.npmjs.com/package/connect-session-firebase这样的东西并保持firebase作为模型,通过express处理所有路线 . 如果您的快速服务器正在呈现模板而不仅仅是作为JSON API,则更容易 .

相关问题