[英]Firebase RealTime database rules to restrict on user id runs in simulator but not in AngularFire
如果您查看屏幕截图,您可以看到模拟测试通过:
如果 uid 不匹配,它会限制将用户数据添加到用户节点。
可以看到位置是:
/users/6OCBYNh3CTammMWrCjX0F003zab2
换句话说:
/users/$uid
当我尝试从代码中执行此操作时,出现权限被拒绝错误:
private async addNewUserToFirebase(user: firebase.User): Promise<void> {
console.log('adding user to Firebase', user);
try {
const ref = this.db.list('/users');
await ref.update(user.uid, {email: 'test@test.com'});
} catch (error) {
console.error('Unable to add user to firebase db', error);
}
}
@firebase/数据库:FIREBASE 警告:在 /users/6OCBYNh3CTammMWrCjX0F003zab2 更新失败:permission_denied
但是,如果我将规则更改为简单
".write": "auth != null"
然后它工作。 那么为什么当我尝试匹配 uid 时它会失败?
笔记
我也试过:
const refAccount = this.db.list('/users');
await refAccount.update(`/${user.uid}`, {email: "test@test.com");
并得到同样的错误。
我已经尝试过来自模拟器和代码的多个用户。 结果是一致的。
然而, 这个问题显示了相同的规则,并且对于该 OP 它有效。
所以这似乎是getRedirectResults()
的问题
进一步的测试发现此代码有效(使用规则userId === auth.id
):
this.angularFireAuth.onAuthStateChanged(user => {
firebase
.database()
.ref('users')
.child(user.uid)
.child('email')
.set('test@test.com');
});
但事实并非如此,因为用户始终是 null:
this.angularFireAuth.getRedirectResult().then(credential => {
firebase
.database()
.ref('users')
.child(credential.user.uid)
.child('email')
.set('test@test.com');
});
这仍然不能解释为什么有时auth.uid != null
有效。
但似乎我不是唯一一个在getRedirectResults()
上拥有 null 用户的人,正如您在此处看到的那样, 这里有官方错误报告
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.