【问题标题】:Firebase Security Rules: "auth != null" does not work for queries from firebase-adminFirebase 安全规则:“auth!= null”不适用于来自 firebase-admin 的查询
【发布时间】:2021-10-22 23:01:42
【问题描述】:

我有一个程序,它在每个页面上加载我的 firebase 凭据并初始化 auth = firebase.auth()。此外,我还包括了 auth.onStateChanged 函数来确定用户的身份验证状态是否有任何变化。

但是,在尝试从数据库中检索信息时(主要是在刷新我的页面时),它说:

客户无权访问所需数据。

当我尝试从特定节点检索数据时,我有规则“auth!= null”,但这不起作用,但当我也更改它时,“auth == null”它确实有效强>。因此,这意味着 auth 在 firebase 数据库规则中没有改变,即使我有 auth.onStateChange 函数。

我能够在浏览器控制台中打印 auth 变量,而且它绝对不为空。

在允许 firebase 安全规则检查 auth 变量之前,如何解决此问题以确保已建立/连接身份验证?

main.js(客户端)

var config = {
    apiKey: "X",
    authDomain: "X",
    databaseURL: "X",
    projectId: "X",
    storageBucket: "X",
    messagingSenderId: "X",
    appId: "X",
    measurementId: "X"
};

firebase.initializeApp(config);
firebase.analytics();
var auth = firebase.auth();

auth.onAuthStateChanged(user => {
  if (user) {
  // code for signed in user
  } else {
  // code for not signed in user
  }

});

index.js(服务器)

var firebase = require('firebase/app');

require("firebase/auth");
require('firebase/database');
require("firebase/firestore");
var admin = require('firebase-admin');

var config = {
  apiKey: process.env.APIKEY,
  authDomain: process.env.AUTHDOMAIN,
  databaseURL: process.env.DATABASEURL,
  projectId: process.env.PROJECTID,
  storageBucket: process.env.STORAGEBUCKET,
  messagingSenderId: process.env.MESSAGINGSENDERID,
  appId: process.env.APPID,
  measurementId: process.env.MEASUREMENTID
};
firebase.initializeApp(config);

admin.initializeApp({
  credential: admin.credential.cert('./serviceAccountKeys directory'),
  databaseURL: "X"
});

/*
using firebase commands to access firebase content such as:
  - firebase.database().ref
*/

编辑 1:

我的查询是“firebase.database().ref('db-bank/')”

数据库看起来像这样:

/db-bank/content1

firebase 规则是:

"db-bank": {
  ".read": "auth != null",
  ".write": false,
},

【问题讨论】:

  • 身份验证不会改变“规则”。它在客户端应用程序中发生变化,并与您的查询一起发送以在后端的规则中进行评估。但是您没有在此处显示查询,也没有显示规则。请编辑问题以显示失败的查询代码,以及证明用户在查询之前已完全登录的代码行(打印firebase.auth().currentUser)。你还应该展示你的规则。问题中应该有足够的信息,任何人都可以使用重复的问题。
  • 所以 auth 在客户端上发生了变化,但是我的查询(我现在将编辑),它没有被发送。在执行“if(user){}”之后,在 onauthstatechange 函数中,我打印了 currentuser 并返回一个对象(非空);那么,理论上它应该在 firebase 安全规则中起作用,对吧?
  • 每次查询都会发送身份验证信息。如果没有看到您的代码,我们无法确定您是否做错了什么。您需要说明用户肯定在运行查询的代码行之前登录。
  • 我刚刚意识到一些事情。这可能是因为我正在客户端上对用户进行身份验证(onauthchange)并且我试图从服务器调用查询(用户在技术上没有经过身份验证)?
  • 这听起来像是在您的问题中提及的一个重要细节。我们应该能够复制您完全解释的场景。如果没有完整的复制步骤,我们所能做的就是推测。我建议阅读:stackoverflow.com/help/minimal-reproducible-example

标签: javascript firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

在后端使用 Firebase Admin SDK 的代码不受安全规则的影响。阅读:

规则仅适用于用户实际登录的客户端应用代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多