#firebase #google-cloud-firestore #firebase-authentication #angular10
#firebase #google-cloud-firestore #firebase-аутентификация #angular10
Вопрос:
Я использую 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();
AuthService:
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()
Пожалуйста, предложите.
Ответ №1:
Как объясняется в документе, это происходит потому, что:
delete()
это операция, чувствительная к безопасности, которая требует, чтобы пользователь недавно вошел в систему.
В документе также указано, что:
Если это требование не выполнено, попросите пользователя пройти проверку подлинности еще раз, а затем вызовите
firebase.User.reauthenticateWithCredential
.
Итак, вам нужно обработать эту конкретную ошибку и сделать так, как указано в документе, т. Е. «попросить пользователя снова пройти аутентификацию, а затем вызвать reauthenticateWithCredential
«.
Комментарии:
1. Привет, я вызывал
user.reauthenticateWithCredential()
этот метод раньше, и только если пользователь успешно аутентифицировался, этот метод вызывается.2. Пожалуйста, проверьте сообщение. Я добавил весь поток.
3. Если я не ошибаюсь, я не вижу ни одного места в вашем коде, куда вы вызываете
reauthenticateWithCredential()
.4. Извините, я просто пропустил добавление этой части здесь. он вызывается из
reauthenticate()
метода. n