Firebase身份验证有多安全?

4
我不确定从何处开始,但最近在寻找无服务器数据库时,我看到了“Firebase”,虽然它对我来说很有趣,但我有点担心直接将我的API代码放在JS文件中,因为这显然可以通过源码查看,但我已经阅读了一些页面并了解到你可以更改读/写规则并进行身份验证。因此,在阅读了一些页面后,我不再担心API的问题。
但主要问题是:
我想为我的页面创建一个管理门户,例如我的管理员页面位于 localhost/admin/ <<<<该页面将只有一个登录表单用于访问门户,所以一切都设置好了。
var config = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
};

firebase.initializeApp(config);

firebase.auth().onAuthStateChanged(function(user) {

      if (user) {
      window.location = '/portal.html'
      }

      else {
      // Do nothing
      }
});

$("#loginbtn").click(function() {

var email = $('#login-name').val();
var password = $('#login-pass').val();

firebase.auth().signInWithEmailAndPassword(email, password)
    .catch(function(error) {
  // Handle Errors here.

});

});

当我成功登录后,系统会将我重定向到该页面,但是有人可以查看源代码,然后手动进入该页面并输入吗?
即使我打算构建一个单页面应用程序并决定在登录后更改页面状态,无论我之后要执行什么功能,有人仍然可以找到并注入代码吗?
我对此不是很了解,但这是我在开始项目之前考虑的问题,所以是否还有其他解决方法?

你可能想考虑通过库进行路由,以及使用Firesafe https://firebase.googleblog.com/2014/02/firesafe-add-complex-security-logic-to.html - Chris Chen
1个回答

4
如果您想添加管理员功能并且正在使用Firebase实时数据库,则需要设置一些自定义Firebase规则,以仅允许管理员访问受限数据。因此,如果非管理员用户登录,他们将无法修改/访问仅限管理员的数据。使用Firebase规则完成此操作的一种方法是使用/whitelist节点存储所有列入白名单的管理员UID(例如uid1: "bojeil@bla.com", uid2: "puf@bla.com"),然后对受限制的管理员节点进行顶级安全规则,例如".write": "auth != null && root.child('whitelist').child(auth.uid).exists()"。这很简单,但效果显著。
如果您没有使用实时数据库而是构建传统的Web应用程序,则需要保护受限制的管理员资源。您需要将Firebase ID令牌发送到后端。您可以通过设置带有其值的会话cookie并确保在刷新Firebase ID令牌时每小时更新该会话cookie来完成此操作。当请求中发送了cookie时,您检查它,解码它(您可以使用Firebase Admin SDK进行解码)并检查其所属的用户是否为管理员。如果是,则允许访问,否则阻止访问。在每个页面上,您都需要添加一个onAuthStateChanged侦听器。如果触发null,则重定向到登录页面。如果会话cookie包含非管理员的ID令牌,则可以在服务器上进行HTTP重定向到非管理员部分。
简而言之,您需要通过发送请求的Firebase ID令牌并双重检查其用户是否具有足够的权限来强制执行后端检查。

3
现在,我经常在第一点中使用“/whitelist”节点,其中包含“uid1:“bojeil@bla.com””和“uid2:“puf@bla.com””,然后有一个顶级安全规则,如“.write”:“auth!= null && root.child(“whitelist”).child(auth.uid).exists()”。这相当简单,但效果却很大。@bojeil:请随意将此示例添加到您的回答中。 - Frank van Puffelen
完成。谢谢弗兰克。 - bojeil
你能把“whitelist”改成“whitelist”吗? - DeveloperKurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接