Метод Firebase user.delete() работает, но с ошибкой

Я использую angular и имею приложение, в котором хранятся данные пользователя и информация для входа. При попытке удалить пользователя я сначала удаляю всю информацию, связанную с пользователем. Затем попросите пользователя повторно аутентифицировать себя, после аутентификации пользователь выходит из системы, и его основные данные извлекаются, чтобы показать удаленный идентификатор профиля, а затем информацию для входа с помощью user.delete().

Все это работает, как и ожидалось, но в конце я получаю сообщение об ошибке. Почему я получаю эту ошибку, даже если я уже вышел из приложения.

Сообщение об ошибке: {code: "auth/user-token-expired", message: "The user's credential is no longer valid. The user must sign in again.", a: null}

Мой код -

  deleteAccount(){
    var userToDelete = firebase.auth().currentUser;
    this.logout();
    this.store.dispatch(UI.StartAppLoad({status:'Deleting User Details...'}));

    this.userService.DeleteUser(userToDelete.uid)
    .then((res)=>{
      console.log(res);
    }).catch(this.HandleError.bind(this));

    userToDelete.delete().then(
      (res)=>{
        console.log(res);
        this.uiService.showSnackbar('User Account Deleted',null,3000);
        this.store.dispatch(UI.LoadApp());
      }
    ).catch(this.HandleError.bind(this));
  }

  logout() {
    this.afAuth.signOut();
  }

где HandleError используется для отображения сообщения об ошибке в закусочной.

deleteAccount() вызывается после успешной аутентификации пользователя.

Вместо отображения сообщения об ошибке я хочу отобразить сообщение 'User Account Deleted'.

Весь поток -

  onDeleteAccount(){
    const confirmResult = this.uiService.showConfirm({
      isDanger:true,
      title:'Delete Account?',
      content:'All your user account data will be permamnently deleted.'+
              ' You will need to create a new account later. Are you sure you want to continue?',
      okText:'Delete'
    });
    confirmResult.subscribe(async isDelete=>{
      if(isDelete){
        this.store.dispatch(UI.StartAppLoad({status:'Deleting Excercise Data...'}));
        const isResetDone = await this.trainingService.resetPastExercise();
        if(isResetDone){
          this.store.dispatch(UI.StartAppLoad({status:'Deleting Follow list...'}));
          this.userService.clearFollowList();
          this.authService.actionToPerform.next(actions.Delete_Account);
          this.store.dispatch(UI.LoadApp());
          this.router.navigate([AppRoutes.ReAuthenticate]);
        }
      }
    });
  }

Аутентифицировать метод submit() страницы:

this.authService.reauthenticate({
  email:form.value.email,
  password:form.value.password
});

this.authService.deleteAccount();

Служба авторизации:

reauthenticate(authdata: AuthData) {
    this.store.dispatch(UI.StartLoading());
    var credential = firebase.auth.EmailAuthProvider.credential(
      authdata.email,
      authdata.password
    );
    this.afAuth.currentUser.then((user) => {
      user.reauthenticateWithCredential(credential)
        .then((res)=>{
          this.prevPwd = authdata.password;
          console.log(res);
          this.store.dispatch(UI.StopLoading());
        })
        .catch(this.HandleError.bind(this))
    });
  }

И затем вышеописанный метод deleteAccount()

Пожалуйста, предложите.


person Daisy    schedule 31.08.2020    source источник


Ответы (1)


Как объясняется в документе, это происходит потому что:

delete() – это операция с учетом требований безопасности, для которой требуется, чтобы пользователь недавно вошел в систему.

В документе также указано, что:

Если это требование не выполняется, попросите пользователя снова пройти аутентификацию, а затем вызовите firebase.User.reauthenticateWithCredential.

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

person Renaud Tarnec    schedule 31.08.2020
comment
Привет, я вызывал user.reauthenticateWithCredential() перед этим методом, и только если пользователь успешно аутентифицировал себя, этот метод вызывается. - person Daisy; 31.08.2020
comment
Пожалуйста, проверьте сообщение. Я добавил весь поток. - person Daisy; 31.08.2020
comment
Если я не ошибаюсь, я не вижу места в вашем коде, где вы вызываете reauthenticateWithCredential(). - person Renaud Tarnec; 31.08.2020
comment
Извините, я просто пропустил добавление этой части сюда. он вызывается из метода reauthenticate(). \n - person Daisy; 31.08.2020