Estoy tratando de usar los protectores del enrutador Angular2 para restringir el acceso a algunas páginas en mi aplicación. Estoy usando Firebase Authentication. Para verificar si un usuario ha iniciado sesión con Firebase, tengo que llamar .subscribe()al FirebaseAuthobjeto con una devolución de llamada. Este es el código para el guardia:
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AngularFireAuth } from "angularfire2/angularfire2";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AngularFireAuth, private router: Router) {}
canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean>|boolean {
this.auth.subscribe((auth) => {
if (auth) {
console.log('authenticated');
return true;
}
console.log('not authenticated');
this.router.navigateByUrl('/login');
return false;
});
}
}
Cuando se navega a una página que tiene el guardia en ella, authenticatedo not authenticatedse imprime en la consola (después de una demora esperando la respuesta de firebase). Sin embargo, la navegación nunca se completa. Además, si no he iniciado sesión, se me redirige a la /loginruta. Entonces, el problema que tengo es return trueque no muestra la página solicitada al usuario. Supongo que esto se debe a que estoy usando una devolución de llamada, pero no puedo averiguar cómo hacerlo de otra manera. ¿Alguna idea?