Правила базы данных Firebase RealTime для ограничения идентификатора пользователя запускаются в симуляторе, но не в AngularFire - PullRequest
2 голосов
/ 27 мая 2020

Если вы посмотрите на снимок экрана, вы увидите, что смоделированный тест пройден:

firebase test

Он ограничивает добавление пользовательских данных в узел пользователей, если 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 / database: FIREBASE WARNING: обновление в / users / 6OCBYNh3CTammMWrCjX0F003zab2 не удалось: permission_denied

Однако, если я изменю правило просто

".write": "auth != null" 

, тогда оно работает. Так почему же это не удается, когда я пытаюсь сопоставить uid?

ПРИМЕЧАНИЕ

Я также пробовал:

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

и получаю то же самое ошибка.

Я пробовал с несколькими пользователями как из симулятора, так и из кода. Результаты согласуются.

Тем не менее, этот вопрос показывает идентичные правила, и для этого OP он работает.

1 Ответ

1 голос
/ 27 мая 2020

Так что, похоже, это проблема с 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() как видите здесь и есть официальный отчет об ошибке здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...