【发布时间】: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