【问题标题】:How secure is firebase with auth?使用身份验证的 Firebase 有多安全?
【发布时间】:2017-06-07 01:31:26
【问题描述】:

我不知道从哪里开始,但我最近在搜索没有服务器数据库时看到了“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.

});

});

所以当我成功登录时,它会将我重定向到该页面,但有人可以查看源代码,然后手动进入该页面并输入吗?

或者即使我打算构建一个页面应用程序并决定在登录后更改页面状态,之后我要执行的任何功能,还有人可以找出并注入代码吗?

我不是这方面的专家,但这是我在开始我的项目之前的想法,所以还有其他方法吗?

【问题讨论】:

标签: javascript firebase firebase-authentication


【解决方案1】:

如果您想添加管理员功能并且正在使用 Firebase 实时数据库,则需要设置一些自定义 Firebase 规则以仅允许管理员访问受限数据。因此,如果非管理员用户登录,他们将无法修改/访问仅限管理员的数据。 使用 Firebase 规则执行此操作的一种方法是使用带有 uid1: "bojeil@bla.com", uid2: "puf@bla.com"/whitelist 节点来存储所有列入白名单的管理员 UID,然后为受限管理员节点(如 ".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 重定向到用户非管理员部分。

tldr;您需要通过将 Firebase ID 令牌与请求一起发送并仔细检查其用户是否具有足够的权限来强制检查后端。

【讨论】:

  • 对于第 1 点,我现在经常有一个带有 uid1: "bojeil@bla.com"uid2: "puf@bla.com"/whitelist 节点,然后是像 ".write": "auth != null && root.child("whitelist').child(auth.uid).exists()" 这样的顶级安全规则。这相当简单,但还有很长的路要走。 @bojeil:随时将此示例添加到您的答案中。 :-)
  • 完成。谢谢弗兰克。
  • 你能用 ('whitelist') 更改 ("whitelist') 吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2019-03-23
  • 2019-01-20
  • 2021-05-31
  • 2018-08-27
  • 2020-12-12
相关资源
最近更新 更多