使用带有Firebase的NodeJ – 安全性

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

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

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

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

因此,不要让客户端击中由您的NodeJS服务器提供服务的REST端点,请让客户端写入您的NodeJS服务器正在监视的Firebase位置。 然后,您可以使用Firebase安全规则validation客户端写入的数据,并且服务器可以信任它。

例如,如果你想这样做,所以用户可以通过你的应用程序发送任意的电子邮件(你的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代码中,你可以调用.auth()和你的Firebase秘密(所以你可以读写所有东西),然后:

 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(); }); 

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

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