2017-03-16 32 views
0

我在這些路由的Angular 2應用中有一個auth guard,我正在使用Firebase進行身份驗證。有什麼奇怪的是,我已經爲維護登錄用戶進行頁面刷新而對功能進行了整理,但是當我的認證守衛在路由上處於活動狀態時,它會一直告訴我用戶未登錄。是否有人可以向我解釋我做錯了什麼?AngularFire2 - AuthGuard認爲用戶沒有登錄,即使他們是

這裏是我的身份驗證後衛代碼:

constructor(private authService:AuthService, private router:Router) { 

    } 

    canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<boolean> { 

    return this.authService.getAuthenticated().map(authenticated => { 
    if(authenticated) { 
     return true; 
    } else { 
     this.router.navigate(['/login']); 
    } 
    }).take(1); 
} 

然後在我的身份驗證服務,這裏的代碼,以確保用戶達最新:

authInfo$: BehaviorSubject<AuthInfo> = new BehaviorSubject<AuthInfo>(AuthService.UNKNOWN_USER); 


     constructor(private auth: AngularFireAuth, private router:Router) { 
     auth.subscribe((authState) => { 
     if (authState) { 
      const authInfo = new AuthInfo(authState.uid); 
      this.authInfo$.next(authInfo); 
     } 
     }); 
     } 


// Added a method to return the auth to be checked against 
getAuthenticated(): Observable<any> { 
    return this.auth; 
    } 

更新:我更新了我的canActivate函數和auth服務,以適合我。

回答

0

我認爲合併您的驗證服務和您的服務可能更容易。

這裏是一個authguard服務我編寫的例子:在導航時工作

private loggedIn: boolean = false; 

    constructor(
    private router: Router, 
    private af: AngularFire, 
) { 
    af.auth.subscribe(res => this.onAuthChange(res)); 
    } 

    private onAuthChange(auth) { 
    this.loggedIn = auth ? true : false; 
    } 

    canActivate(routeSnapshot: ActivatedRouteSnapshot): boolean { 
    if (this.loggedIn) { 
     return true; 
    } 
    console.log('Route blocked by AuthGuardService'); 
    this.router.navigate(['/login']); 
    return false; 
    } 
+0

哦真棒,這工作得很好:)我注意到的事情是,即使這段代碼中,登錄狀態通過應用程序,但如果我刷新一個具有路線警衛的頁面,它仍然會重定向到登錄頁面。任何線索可能是什麼? –

+0

確保您的app.module.ts是AuthGuardService的提供者。 – Ploppy

+0

是的,我明白了。有趣的是,auth狀態的檢查發生在auth防護功能之後。我不確定這是否是一種競爭狀態,或者是什麼,因爲警衛立即發生,同時我的身份驗證檢查異步發生。嗯,我可能會做什麼想法? –

相關問題