从本质上讲,这里的问题是,您需要安全地向您的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 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服务器发送电子邮件,这很可能是您想要的行为。这也意味着,如果您的服务器暂时关闭,则在启动它时,它将“赶上”发送电子邮件,一切将继续正常进行。



