Node.js 将NodeJs与Firebase一起使用-安全性

Node.js 将NodeJs与Firebase一起使用-安全性,node.js,firebase,Node.js,Firebase,由于需要编写一些服务器端代码(主要是发送电子邮件),我决定使用Nodejs&Express作为服务器端元素,同时使用Firebase保存数据,这部分是出于学习经验 我的问题是,在使用简单的电子邮件和密码API进行身份验证时,使用客户端Firebase库和Nodejs库的最佳方法是什么。如果我在客户端进行身份验证,然后在NodeJS端调用不同的路由,那么该用户的身份验证将在请求中进行。在节点内测试用户身份验证的方法是什么 我假设的一种方法是从firebase获取当前用户的用户名和密码,然后将其发布

由于需要编写一些服务器端代码(主要是发送电子邮件),我决定使用Nodejs&Express作为服务器端元素,同时使用Firebase保存数据,这部分是出于学习经验

我的问题是,在使用简单的电子邮件和密码API进行身份验证时,使用客户端Firebase库和Nodejs库的最佳方法是什么。如果我在客户端进行身份验证,然后在NodeJS端调用不同的路由,那么该用户的身份验证将在请求中进行。在节点内测试用户身份验证的方法是什么


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

本质上,这里的问题是,您需要安全地向您的NodeJS服务器传递客户端已通过firebase身份验证的信息。有几种方法可以做到这一点,但最简单的方法可能是让所有ClientNodeJ通信都通过Firebase本身进行

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

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

{
  "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作为模型,通过express处理所有路线。如果您的express服务器呈现的是模板,而不仅仅是JSON API,那么就更容易了。

这是一个很好的建议-谢谢。也许firebase文档可以扩展到包含这种架构建议。这样,电子邮件发送的错误处理也应该通过firebase完成。。。FYISee还提供了一个很好的策略,用于在这种场景中的消费者(客户端和特权服务器)之间进行这种传递。发送电子邮件的节点服务器需要SSL。或者标准http就足够了?