Я реализую страницу аутентификации в firebase. Поэтому я настроил Angular service
UserService
примерно так:
export class UserService {
public authenticated: boolean;
public error: any;
public currentUser: User;
constructor(public afAuth: AngularFireAuth) {
this.authenticated = false;
this.afAuth.authState.subscribe(authenticated => {
if (authenticated) {
this.authenticated = true;
}
});
}
async loginWithGoogle() {
try {
const result = await this.afAuth.auth.signInWithPopup(new auth.GoogleAuthProvider());
this.authenticated = true;
console.log(result.user);
} catch (e) {
this.error = e;
}
}
async loginWithFacebook() {
try {
await this.afAuth.auth.signInWithPopup(new auth.FacebookAuthProvider());
this.authenticated = true;
} catch (e) {
this.error = e;
}
}
}
Кажется, это работает нормально. Но потом, когда я пытаюсь получить доступ к маршруту, защищенному следующим охранником:
export class AuthenticatedGuard implements CanActivate {
constructor(public userService: UserService, private router: Router) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
alert(this.userService.authenticated);
if (this.userService.authenticated) {
return true;
}
this.router.navigate(['/']);
return false;
}
}
Но this.userService.authenticated
всегда false
.
Есть ли лучший способ сделать это? Если нет, то что здесь не так? Может быть authenticated
должен быть Observable
охранником подписаться?