繁体   English   中英

Firebase 实时数据库规则限制用户 id 在模拟器中运行但不在 AngularFire 中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM