Firebase Auth: невозможно удалить документы Firestore в обещании, возвращенном из currentUser.delete () - PullRequest
1 голос
/ 05 августа 2020

Я использую аутентификацию firebase и angularfirestore в своем приложении, и я столкнулся со странной проблемой. Я хочу удалить пользовательский документ в firestore после удаления пользователя в firebase auth, как показано ниже, но часть firestore не работает.

Edit 2 : в коде this.currentUser не то же самое, что angularFireAuth.auth.currentUser. Это локальная переменная, которую я создал отдельно.

return this.angularFireAuth.auth.currentUser.delete().then(() => {
            this.angularFirestore.collection("userData").doc(this.currentUser.email).delete().then(() => {
                this.currentUser = null;
                this.currentUserSubject$.next(this.currentUser);
                this.setAuthenticationDetails({authType: null, rememberMe: false});
                this.storageService.setRememberedUser(null);
            });
        })

Однако, если бы я сначала удалил документ из firestore, а потом удалил пользователя из firebase auth, это сработает.

return this.angularFirestore.collection("userData").doc(this.currentUser.email).delete().then(() => {
            return this.angularFireAuth.auth.currentUser.delete().then(() => {
                this.currentUser = null;
                this.currentUserSubject$.next(this.currentUser);
                this.setAuthenticationDetails({authType: null, rememberMe: false});
                this.storageService.setRememberedUser(null);
            });
        })

Кто-нибудь знает, почему это происходит? Они оба возвращают обещания, поэтому я ожидал, что поведение будет одинаковым.

Edit 1 : добавлен улов, но ничего не печатается

return this.angularFireAuth.auth.currentUser.delete().then(() => {
            return this.angularFirestore.collection("userData").doc(this.currentUser.email).delete().then(() => {
                this.currentUser = null;
                this.currentUserSubject$.next(this.currentUser);
                this.setAuthenticationDetails({authType: null, rememberMe: false});
                this.storageService.setRememberedUser(null);
            }, (error) => {
                console.log(error);
            });
        }, (error) => {
            console.log(error);
        })

Edit 3 : Правила безопасности

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Ответы [ 2 ]

1 голос
/ 05 августа 2020

То, что вы наблюдаете, имеет для меня смысл.

Если у вас есть правила безопасности, настроенные в Firestore, которые требуют аутентифицированного пользователя для удаления документов, имеет смысл, что документы не удастся удалить после удаления учетной записи пользователя (поскольку пользователь больше не аутентифицирован). Вы определенно захотите сделать все возможное во время аутентификации перед выходом из системы или удалением учетной записи.

Вы должны добавить проверку ошибок в свой код, чтобы выяснить, не что-то пошло не так с документом Удалить. Прямо сейчас у вас нет обратных вызовов catch в цепочке обещаний, поэтому вы никогда не узнаете, если что-то пойдет не так. Я подозреваю, что при удалении документа вы увидите ошибку типа «доступ запрещен» из-за того, что правила безопасности отклоняют запрос.

0 голосов
/ 05 августа 2020

Я думаю, что произошло то, что после того, как вы сделаете auth.currentUser.delete(), this.currentUser также очищается (если он содержит auth.currentUser)

Итак, вы просто удаляете doc(""), что не привело к ошибке. Но такого документа нет, поэтому вы ничего не увидите.

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