2016-09-09 2 views
1

AngularFire2를 사용하는 각도 2 RC6. 내 인증은 보호 된 경로 ("/ feed")로 리디렉션됩니다. AuthGuard에서 canActivate 메소드가 실행되면 인증은 항상 null입니다. 가드가 구성되기 전에 인증이 발생하는 것처럼 보이므로 가드에 가입하면 아무 것도 작동하지 않습니다.CanActivate가 작동하지 않는 AngularFire2 인증

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] 
    } 
]; 

인증-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의 작업이 절대로 발생하지 않습니다. 관찰 정식 어느 날 해고되지

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

로그인과 가드에서'console.log' 호출의 순서를 자세히 살펴볼 것입니다. 전자가 처음이라면 경비원은 라우팅 후에 발급 된 인증 상태를 수신하게되며 이는 사용자가보고있는 동작을 설명합니다. – cartant

+0

죄송합니다. 콘솔 출력을 넣는 것을 잊어 버렸습니다. 질문에 추가했습니다. –

답변

1

당신은 아마 이런 식으로 뭔가를 할 수 있습니다.

+0

'auth' 관찰 가능 항목에서 아무 것도 방출하지 않으면 [문제 제기] (https://github.com/angular/)를 제안합니다. AngleFireAuth' 관측치는 버퍼 크기가 1 인 [ReplaySubject]입니다 (https://github.com/angular/angularfire2/blob/master/src/auth/auth.ts#L30). -L35), 값을 내야합니다. – cartant

+1

이미 문제가 있습니다 : https://github.com/angular/angularfemale2/issues/496 – rockwotj

+0

예를 들어 주셔서 감사합니다. 거짓이라면 반환하겠습니까? auth? –