火力点许可被拒绝

我对编程相对较新,遇到了一些麻烦。

我有这个代码可以把数据发送到消防站

app.userid = app.user.uid


var userRef = app.dataInfo.child(app.users);


var useridRef = userRef.child(app.userid);


useridRef.set({
locations: "",
theme: "",
colorScheme: "",
food: ""
});

然而,我一直得到这个错误:

FIREBASE 警告: 在/users/(GoogleID)设置失败: mission _ ) 2016-05-2322:52:42.707 firebase.js: 227未捕获(在承诺中)错误: 许可 _ 否认: 许可被拒绝(...)

当我试图查阅这篇文章的时候,它谈到了 Firebase 的规则,这似乎是一门我还没有学过的语言(或者只是超出了我的理解范围)。有人能解释一下是什么导致了这个问题吗?我以为是我要求它存储电子邮件和用户显示名称,你只是不允许这样做,但当我删除这些我仍然有同样的问题。有没有办法在不制定规则的情况下避免这种错误,或者规则是我可以在一天之内教会自己如何写作的东西,或者我只是超出了我的能力范围?

谢谢你的帮助!

212087 次浏览

默认情况下,Firebase 控制台中项目中的数据库只对管理用户可读/可写(例如,在云函数或使用管理 SDK 的流程中)。除非更改服务器端安全规则,否则常规客户端 SDK 的用户无法访问数据库。


您可以更改规则,使数据库只对经过身份验证的用户可读/可写:

{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}

看看 Firebase 数据库安全规则的快速启动

但是由于您没有从代码中为用户签名,因此数据库拒绝您访问数据。要解决这个问题,您需要允许对数据库进行未经身份验证的访问,或者在访问数据库之前登录用户。

允许对数据库进行未经身份验证的访问

目前最简单的解决方案(直到教程得到更新)是进入项目控制台中的 Database 面板,选择 Rules 选项卡并用以下规则替换内容:

{
"rules": {
".read": true,
".write": true
}
}

这使您的新数据库对于任何知道数据库 URL 的人来说都是可读和可写的

在访问数据库之前登录用户

对于一个(稍微)更费时但更安全的解决方案,调用 Firebase 认证signIn...方法之一,以确保用户在访问数据库之前进行了登录。最简单的方法是 使用匿名认证:

firebase.auth().signInAnonymously().catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});

然后在检测到登录时附加侦听器

firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var userRef = app.dataInfo.child(app.users);
    

var useridRef = userRef.child(app.userid);
    

useridRef.set({
locations: "",
theme: "",
colorScheme: "",
food: ""
});


} else {
// User is signed out.
// ...
}
// ...
});
  1. 打开火力点,选择左边的数据库。
  2. 现在在右手边,从淹没中选择[ Realtime database ] ,然后将规则更改为:
{
"rules": {
".read": true,
".write": true
}
}

进入你提到的“数据库”选项。

  1. 在蓝色标题上,你会看到一个下拉列表,上面写着“云火恢复测试版”
  2. 改成“实时数据库”
  3. 转到 Rules 并设置。 write。 read 都为 true

给你复制。

我遇到过类似的问题,发现这个错误是由于为实时数据库的读/写操作设置了不正确的规则。默认情况下 google firebase 现在加载云存储不是实时数据库。我们需要切换到实时,并应用正确的规则。

enter image description here

正如我们可以看到它说,云火还原不是实时数据库,一旦切换到正确的数据库应用下面的规则:

{
"rules": {
".read": true,
".write": true
}
}

注:

小心规则。通过设置读和写 true使数据库容易祈祷的眼睛。

延伸阅读:

Https://firebase.google.com/docs/database/security

进入数据库,标题旁边有两个选项:

云火还原,实时数据库

选择 Realtime database 并转到 rules

把规则改为真。

另一个解决方案是,如果您手边已经有了凭据,那么实际上可以自动创建或登录用户。下面是我如何使用普通 JS 做到这一点。

function loginToFirebase(callback)
{
let email = 'xx@xx.com';
let password = 'xxxxxxxxxxxxxx';
let config =
{
apiKey: "xxx",
authDomain: "xxxxx.firebaseapp.com",
projectId: "xxx-xxx",
databaseURL: "https://xxx-xxx.firebaseio.com",
storageBucket: "gs://xx-xx.appspot.com",
};


if (!firebase.apps.length)
{
firebase.initializeApp(config);
}


let database = firebase.database();
let storage = firebase.storage();


loginFirebaseUser(email, password, callback);
}


function loginFirebaseUser(email, password, callback)
{
console.log('Logging in Firebase User');


firebase.auth().signInWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(login_error)
{
let loginErrorCode = login_error.code;
let loginErrorMessage = login_error.message;


console.log(loginErrorCode);
console.log(loginErrorMessage);


if (loginErrorCode === 'auth/user-not-found')
{
createFirebaseUser(email, password, callback)
}
});
}


function createFirebaseUser(email, password, callback)
{
console.log('Creating Firebase User');


firebase.auth().createUserWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(create_error)
{
let createErrorCode = create_error.code;
let createErrorMessage = create_error.message;


console.log(createErrorCode);
console.log(createErrorMessage);
});
}

好吧,但是你不想打开整个实时数据库! 你需要这样的东西。

{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": "auth.uid !=null",
".write": "auth.uid !=null"
}
}

或者

{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}

如果您试图在 firebase 中重用旧项目,由于免费帐户限制,那么您的数据库规则可能已经过时。

在我的例子中,我得到了错误401未授权,当我将读取和写入规则都设置为 true 时,它解决了这个问题。

感谢这个伟大的社区!

来自巴西的尊敬!

如果 只要 Firebase 项目 ID 不正确

请参阅 这本指南以检查您的项目 ID:

Firebase 控制台: 单击设置项目设置。项目 ID 显示在顶部窗格中。

我也有同样的问题。确保您使用的是实时数据库而不是云。然后修改规则以允许访问所有用户,如下所示

{
"rules": {
".read": true,
".write": true
}
}

默认情况下,火灾恢复数据库只允许管理员从数据库读写,因此读/写规则将被设置为 false。