Firebase 权限被拒绝
Firebase Permission Denied
我对编码比较陌生,遇到了麻烦。
我有这个代码可以将数据发送到 firebase
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 WARNING: set at /users/(GoogleID) failed: permission_denied
2016-05-23 22:52:42.707 firebase.js:227 Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied(…)
当我尝试查找它时,它谈到了 Firebase 的规则,这似乎是一种我还没有学过的语言(或者它只是在我的脑海中)。有人可以解释导致问题的原因吗?我以为是我要求它存储电子邮件和用户显示名称,而你不允许这样做,但当我把它们拿出来时,我仍然遇到同样的问题。有没有办法在不设置规则的情况下避免这个错误,或者规则是我可以在一天内自学如何写的东西,还是我只是脱离了我的联盟?
感谢您的帮助!
默认情况下,Firebase Console 中的项目中的数据库仅 readable/writeable 由管理用户使用(例如,在 Cloud Functions 中,或使用 Admin SDK 的进程)。除非您更改服务器端安全规则,否则常规客户端 SDK 的用户无法访问数据库。
您可以更改规则,使数据库仅 readable/writeable 由经过身份验证的用户访问:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
参见quickstart for the Firebase Database security rules。
但是由于您没有从您的代码中让用户登录,数据库拒绝您访问数据。要解决这个问题,您需要允许未经身份验证的访问您的数据库,或者在访问数据库之前登录用户。
允许未经身份验证访问您的数据库
目前最简单的解决方法(在教程更新之前)是进入项目控制台的数据库面板,select 规则选项卡并用这些规则替换内容:
{
"rules": {
".read": true,
".write": true
}
}
这使您的新数据库对任何了解该数据库 URL 的人都可读可写。 确保在投入生产之前再次保护您的数据库,否则可能有人会开始滥用它。
访问数据库前先登录用户
对于(稍微)更耗时但更安全的解决方案,请调用 Firebase Authentication to ensure the user is signed in before accessing the database. The simplest way to do this is using anonymous authentication 的 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.
// ...
}
// ...
});
- 打开 firebase,select 数据库在左侧。
- 现在在右手边,select [实时数据库] 淹没并将规则更改为:
{
"rules": {
".read": true,
".write": true
}
}
转到您提到的 "Database" 选项。
- 在蓝色 Header 上,您会找到一个下拉菜单,其中显示 Cloud Firestore Beta
- 改为"Realtime database"
- 转到规则并将 .write .read 都设置为 true
复制自 here。
我遇到了类似的问题,发现此错误是由于为实时数据库的 read/write 操作设置的规则不正确造成的。默认情况下 google 现在 firebase 加载云存储而不是实时数据库。我们需要切换到实时并应用正确的规则。
我们可以看到它说云 Firestore 不是实时数据库,一旦切换到正确的数据库应用以下规则:
{
"rules": {
".read": true,
".write": true
}
}
转到数据库,标题旁边有 2 个选项:
Cloud Firestore,实时数据库
Select实时数据库并进入规则
将规则更改为 true。
另一种解决方案是,如果您手边已有凭据,则可以自动创建或登录用户。这是我使用 Plain 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 Unauthorized,当我将读写规则都设置为 true 时它就解决了。
感谢这个伟大的社区!
来自巴西的尊重!
如果提供的 Firebase 项目 ID 不正确,也会出现 PermissionDenied。
请参阅 this guide 检查您的项目 ID:
Firebase console: Click settings Project settings. The project ID is displayed in the top pane.
我也遇到了同样的问题。确保您使用的是 real-time 数据库而不是云。然后更改规则以允许所有用户访问,如下所示
{
"rules": {
".read": true,
".write": true
}
}
默认情况下,firestore 数据库只允许管理员读取和写入数据库,因此 read/write 规则将设置为 false。
我对编码比较陌生,遇到了麻烦。
我有这个代码可以将数据发送到 firebase
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 WARNING: set at /users/(GoogleID) failed: permission_denied 2016-05-23 22:52:42.707 firebase.js:227 Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied(…)
当我尝试查找它时,它谈到了 Firebase 的规则,这似乎是一种我还没有学过的语言(或者它只是在我的脑海中)。有人可以解释导致问题的原因吗?我以为是我要求它存储电子邮件和用户显示名称,而你不允许这样做,但当我把它们拿出来时,我仍然遇到同样的问题。有没有办法在不设置规则的情况下避免这个错误,或者规则是我可以在一天内自学如何写的东西,还是我只是脱离了我的联盟?
感谢您的帮助!
默认情况下,Firebase Console 中的项目中的数据库仅 readable/writeable 由管理用户使用(例如,在 Cloud Functions 中,或使用 Admin SDK 的进程)。除非您更改服务器端安全规则,否则常规客户端 SDK 的用户无法访问数据库。
您可以更改规则,使数据库仅 readable/writeable 由经过身份验证的用户访问:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
参见quickstart for the Firebase Database security rules。
但是由于您没有从您的代码中让用户登录,数据库拒绝您访问数据。要解决这个问题,您需要允许未经身份验证的访问您的数据库,或者在访问数据库之前登录用户。
允许未经身份验证访问您的数据库
目前最简单的解决方法(在教程更新之前)是进入项目控制台的数据库面板,select 规则选项卡并用这些规则替换内容:
{
"rules": {
".read": true,
".write": true
}
}
这使您的新数据库对任何了解该数据库 URL 的人都可读可写。 确保在投入生产之前再次保护您的数据库,否则可能有人会开始滥用它。
访问数据库前先登录用户
对于(稍微)更耗时但更安全的解决方案,请调用 Firebase Authentication to ensure the user is signed in before accessing the database. The simplest way to do this is using anonymous authentication 的 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.
// ...
}
// ...
});
- 打开 firebase,select 数据库在左侧。
- 现在在右手边,select [实时数据库] 淹没并将规则更改为:
{
"rules": {
".read": true,
".write": true
}
}
转到您提到的 "Database" 选项。
- 在蓝色 Header 上,您会找到一个下拉菜单,其中显示 Cloud Firestore Beta
- 改为"Realtime database"
- 转到规则并将 .write .read 都设置为 true
复制自 here。
我遇到了类似的问题,发现此错误是由于为实时数据库的 read/write 操作设置的规则不正确造成的。默认情况下 google 现在 firebase 加载云存储而不是实时数据库。我们需要切换到实时并应用正确的规则。
我们可以看到它说云 Firestore 不是实时数据库,一旦切换到正确的数据库应用以下规则:
{
"rules": {
".read": true,
".write": true
}
}
转到数据库,标题旁边有 2 个选项:
Cloud Firestore,实时数据库
Select实时数据库并进入规则
将规则更改为 true。
另一种解决方案是,如果您手边已有凭据,则可以自动创建或登录用户。这是我使用 Plain 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 Unauthorized,当我将读写规则都设置为 true 时它就解决了。
感谢这个伟大的社区!
来自巴西的尊重!
如果提供的 Firebase 项目 ID 不正确,也会出现 PermissionDenied。
请参阅 this guide 检查您的项目 ID:
Firebase console: Click settings Project settings. The project ID is displayed in the top pane.
我也遇到了同样的问题。确保您使用的是 real-time 数据库而不是云。然后更改规则以允许所有用户访问,如下所示
{
"rules": {
".read": true,
".write": true
}
}
默认情况下,firestore 数据库只允许管理员读取和写入数据库,因此 read/write 规则将设置为 false。