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

Firebase RealTime database rules to restrict on user id runs in simulator but not in AngularFire

如果您查看屏幕截图,您会发现模拟测试通过了:

如果uid不匹配,则限制将用户数据添加到users节点。

可以看到位置是:

/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/database: FIREBASE WARNING: update at /users/6OCBYNh3CTammMWrCjX0F003zab2 failed: permission_denied

但是,如果我将规则更改为

".write": "auth != null" 

然后就可以了。那么,为什么当我尝试匹配 uid 时会失败?

注意

我也试过:

     const refAccount = this.db.list('/users');      
     await refAccount.update(`/${user.uid}`, {email: "test@test.com");

并得到同样的错误。

我在模拟器和代码中都尝试过多个用户。结果一致。

然而 this question 显示相同的规则,并且对于该 OP 它有效。

所以这似乎是 getRedirectResults()

的问题

进一步测试发现此代码有效(使用规则 userId === auth.id):

this.angularFireAuth.onAuthStateChanged(user => {
  firebase
    .database()
    .ref('users')
    .child(user.uid)
    .child('email')
    .set('test@test.com');
});

但这不是,因为用户始终为空:

  this.angularFireAuth.getRedirectResult().then(credential => {
    firebase
      .database()
      .ref('users')
      .child(credential.user.uid)
      .child('email')
      .set('test@test.com');
  });

这仍然不能解释为什么有时 auth.uid !== null 有效。

但我似乎不是唯一在 getRedirectResults() 上拥有空用户的人,正如您所见 here and there is an official bug report here