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