Обновить страницу автоматически выйти из системы в угловых 5 - PullRequest
0 голосов
/ 29 января 2019

Я использую Firebase для входа и регистрации.это мой authService выглядит так:

token: string;
authenticated: boolean = false;
signinUser(email: string, password: string) {
        firebase
            .auth()
            .signInWithEmailAndPassword(email, password)
            .then(response => {
                this.authenticated = true;
                console.log('authService-->signinUser-->authenticated', this.authenticated);


                //Set the a wallet using a combination of the email and the name of the network e.g. Majd@gmail.com@stschain
                this.dataService.setWallet(`${email}${this.domainExtenstion}`);
                this.setEmail(email);
                this.router.navigate(['/dashboard']);
                console.log('sinign in')
                firebase
                    .auth()
                    .currentUser.getIdToken()
                    .then(
                        (token: string) => {
                            (this.token = token);
                            // localStorage.setItem('token', JSON.stringify(token));
                        }
                    );
            })
            .catch(error => {
                console.log(error);
                alert(error);
            });

    }

isAuthenticated() {
   return this.token != null;       
}

и в моем authGuardService я вызываю метод canactivate следующим образом:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    if (!this.authService.authenticated) {
      console.log('cant load' )
      this.router.navigate(['/signin']);
    }
    console.log('can load' )
    return this.authService.isAuthenticated();
  }
}

но когда я обновляю страницу, это значение authenticated всегда становится ложным.

Пожалуйста, кто-нибудь, знайте причину, которая оценит.

1 Ответ

0 голосов
/ 29 января 2019

В вашем коде вы делаете:

firebase
    .auth()
    .signInWithEmailAndPassword(email, password)
    .then(response => {
        this.authenticated = true;

Этот блок then запускается только при явном входе пользователя в систему. Он не запускается автоматически при перезагрузке страницы.

НоАутентификация Firebase делает автоматически (пытается) восстановить сеанс входа пользователя в систему при перезагрузке страницы, ваш код просто не знает об этом.Чтобы обнаружить изменения состояния аутентификации, используйте прослушиватель состояния аутентификации (как показано в документации ):

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

Обратите внимание, что для обратного вызова onAuthStateChanged вызываетсякак явные (например, вы вызываете signInWith...), так и неявные (например, перезагрузка страницы) изменения состояния авторизации, поэтому рассмотрите возможность перемещения (частично) вашего кода из блока then() в этот обратный вызов.

...