Получение отказа в разрешении при попытке проверить, что пользователь Firestore может оставлять комментарии только под своим UID - PullRequest
0 голосов
/ 22 мая 2018

У меня есть этот код, но я не знаю, откуда возникла недостаточная ошибка безопасности.Я не могу понять это.Может ли это быть из cloudfirestore?

postComment(getBlogId: string, comment: any): Promise<any> {
    if (this.currentUser) {
      return this.afs.collection('blogs').doc(getBlogId).collection('comments')
        .add({
          author: {
            '_id': this.currentUser.uid,
            'firstname': this.currentUser.displayName ? this.currentUser.displayName : this.currentUser.email
          },
          comment: comment.comment,
          createdAt: firebase.firestore.FieldValue.serverTimestamp(),
          updatedAt: firebase.firestore.FieldValue.serverTimestamp()
        });
    } else {
      return Promise.reject(new Error('LogIn to Continue!'));
    }
  }

Это в сервисах, но я получаю сообщение об ошибке при отправке комментария.И в моем компоненте, когда я отправляю консоль, он дает мне значение формы и значение идентификатора блога.

onSubmit() {
    console.log(this.commentForm.value);
    console.log(this.blog._id);
    this.blogservices.postComment(this.blog._id, this.commentForm.value)
      .then(() => {
        this.blogservices.getComments(this.blog._id)
          .subscribe(comments => this.blog.comments = comments);
      });
  }

Я не могу разместить его там, где я получаю

Ошибка ERCOR Uncaught (в обещании) FirebaseError [code = access-denied]: отсутствует или недостаточно разрешений FirebaseError: отсутствует или недостаточно разрешений.

И это мои правила пожарного депо, которые я считаю верными, потому что запрос должен совпадать с uid пользователя и ресурсом, приложенным к данным, подлежащим отправке.

 match /comments/{comment}{
      allow delete: if request.data.user_uid == request.auth.uid;
      allow write: if request.resource.data.user_uid == request.auth.uid;
      allow read;
    }

Я пыталсяотправка напрямую без информации о пользователе, но с той же ошибкой.

1 Ответ

0 голосов
/ 22 мая 2018

Вы сравниваете UID публикуемого пользователя (request.auth.uid) с request.resource.data.user_uid.Это означает, что вам нужно иметь поле user_uid в корне вашего документа.

Однако при добавлении документа вы делаете это так:

.add({
  author: {
    '_id': this.currentUser.uid,
    'firstname': this.currentUser.displayName ? this.currentUser.displayName : this.currentUser.email
  },

Так чтоUID текущего пользователя находится в author._id, что отличается от того, на что смотрят ваши правила безопасности.Исправление состоит в том, чтобы убедиться, что оба используют один и тот же путь.Для этого в правилах безопасности будет выглядеть примерно так:

allow write: if request.resource.data.author._id == request.auth.uid;
...