Я намагаюся використовувати захисні пристрої маршрутизатора Angular2, щоб обмежити доступ до деяких сторінок у моєму додатку. Я використовую автентифікацію Firebase. Для того, щоб перевірити, чи ввійшов користувач у систему Firebase, мені потрібно зателефонувати .subscribe()
на FirebaseAuth
об'єкт із зворотним викликом. Це код для охоронця:
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;
});
}
}
Під час переходу до сторінки, на якій є захист authenticated
, або not authenticated
надруковано на консолі (після деякої затримки очікування відповіді від firebase) Однак навігація ніколи не завершується. Крім того, якщо я не ввійшов в систему, мене перенаправлять на /login
маршрут. Отже, проблема, з якою я стикаюся, return true
не відображає користувачеві запитану сторінку. Я припускаю, що це тому, що я використовую зворотний виклик, але я не можу зрозуміти, як це зробити інакше. Будь-які думки?