2016-09-09 4 views
1

Угловой 2 RC6 с использованием AngularFire2. Моя аутентификация работает, что вызывает перенаправление на охраняемый маршрут («/ feed»). Когда метод canActivate в AuthGuard срабатывает, аутентификация всегда равна нулю. Кажется, что аутентификация происходит до того, как охранник когда-либо строится, поэтому подписка в охраннике ничего не делает.Аутентификация AngularFire2 с CanActivate не работает

login.ts (аутентификация работает и перенаправляет на 'корм')

constructor(public af: AngularFire, private router: Router) { 
    this.af.auth.subscribe(auth => console.log(auth)); 
} 
login() { 
    this.af.auth.login({ 
    provider: AuthProviders.Facebook, 
    method: AuthMethods.Popup, 
    }).then((x: FirebaseAuthState) => { 
    console.log(x); 
    this.router.navigate(['/feed']); 
    }).catch(x => console.log(x)); 
} 

feed.routes.ts

export const feedRoutes: Routes = [ 
    { 
    path: '', 
    component: FeedComponent, 
    canActivate: [AuthGuard] 
    } 
]; 

Auth-guard.service.ts

import { Injectable }    from '@angular/core'; 
import { CanActivate, Router, 
     ActivatedRouteSnapshot, 
     RouterStateSnapshot } from '@angular/router'; 
import { AngularFire, AngularFireAuth, FirebaseAuthState }   from 'angularfire2'; 
import { Observable } from 'rxjs'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    auth: FirebaseAuthState; 

    constructor(private af: AngularFire, private router: Router) { 
    console.log('auth guard constructed'); 
    this.af.auth.subscribe(authState => console.log(authState)); 
    this.af.auth.subscribe(x => this.auth = x); 
    } 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    console.log('can activate ' + this.auth) 
    if (this.auth == null){ 
     // this part always fires 
     console.log('no auth!') 
     this.router.navigate(['/login']); 
     return false; 
    } 
     console.log('authenticated'); 
    return true; 
    } 
} 

Вот что напечатано на пульте:

Object {auth: W, uid: "xYFs8kMDpKdYKxDw4AL21FtnSWn1", provider: 2, facebook: Of} 
auth-guard.service.ts:13 auth guard constructed 
auth-guard.service.ts:19 can activate undefined 
auth-guard.service.ts:21 no auth! 

Обратите внимание, что действия в .subscribe никогда не происходят.

+0

Я бы внимательно посмотрел на порядок вызовов 'console.log' у вас в логине и охраннике. Если первое первое, охранник получит излучаемое auth-состояние после маршрутизации, что объяснит поведение, которое вы видите. – cartant

+0

Извините, что я забыл вывести свой вывод на консоль, я добавил его к вопросу –

ответ

1

Вы, вероятно, хотите что-то вроде этого:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    console.log("canActivate"); 
    return this.af.auth.take(1).map(auth => { 
     console.log("auth:" + auth); 
     if (!auth) { 
     this.router.navigateByUrl('/login'); 
     return true; 
     } 
     return !!auth; 
    }); 
    } 

Но авт наблюдаемыми не обжиг для меня тоже.

+0

Если «auth» observable ничего не испускает, я предлагаю [поднимать проблему] (https://github.com/angular/ angularfire2/issues), поскольку наблюдаемый «AngularFireAuth» является ['ReplaySubject' с размером буфера 1] (https://github.com/angular/angularfire2/blob/master/src/auth/auth.ts#L30 -L35), поэтому он должен испускать значение. – cartant

+1

У вас уже возникла проблема: https://github.com/angular/angularfire2/issues/496 – rockwotj

+0

спасибо, например, не хочу ли возвращать false if! Auth? –

Смежные вопросы