-1

我使用Google身份驗證成功登錄和註銷,但我的身份驗證服務未返回登錄狀態。我試圖在我的Auth Guard中讀取它以確定我是否應該直接進入登錄頁面。我得到_googleAuth未定義的錯誤(「TypeError:無法讀取未定義的屬性'isSignedIn'」)。Angular 2從服務獲取Google身份驗證狀態

constructor(private router: Router, private _authService: AuthenticationService) {} 

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
      return this._authService.getAuthenticatedStatusAsObservable() 
      .map((result) => { ... 

的描述性的命名服務方法是這樣的:

getAuthenticatedStatusAsObservable(): Observable<boolean> { 
    if(this._googleAuth){ 
     return Observable.of(this._googleAuth.isSignedIn.get()); 
    } 
    else {return Observable.of(false) } 
    } 
} 

其他服務方法的工作。例如,我可以寫出用戶名。但是,當我試圖獲取狀態(或用戶名)作爲可觀察的,它不起作用。

爲什麼在構造函數中沒有足夠的認證服務?我假設我錯過了使用observables的東西。

loadAuth()被調用的服務的構造函數:

loadAuth() { 
    // attempt to SILENT authorize 
    this.gapiLoad 
    .load('auth2') 
    .switchMap(() => this.authorize()) 
    .do((googleAuth: gapi.auth2.GoogleAuth) => this.saveGoogleAuth(googleAuth)) 
    .do((googleAuth: gapi.auth2.GoogleAuth) => this.listenToGoogleAuthSignIn(googleAuth)) 
    .filter((googleAuth: gapi.auth2.GoogleAuth) => this.isSignedIn()) 
    .filter((googleAuth: gapi.auth2.GoogleAuth) => this.hasAccessToken(googleAuth)) 
    .map((googleAuth: gapi.auth2.GoogleAuth) => googleAuth.currentUser.get()) 
    .subscribe((googleUser: gapi.auth2.GoogleUser) => { 
     this.zone.run(() => this.handleSuccessLogin(googleUser)); 
    }); 
    } 
+0

顯示你是如何初始化'this._googleAuth'的? –

+0

@RomanC添加了它。 thx – beachCode

+0

它的前三行失敗了,你應該調試。對不起,這是題外話 –

回答

2

檢查時,你的代碼初始化gapi.auth2。

這是您需要檢查Google auth登錄狀態的內容。

var result = false; 
gapi.load('auth2', function() { 
    //gapi.auth2.init(authOptions); // if you haven't initialized yet 
    //get instance with client ID, must be called after gapi.auth2.init 
    var googleAuthTest = gapi.auth2.getAuthInstance(); 
    result = googleAuthTest.isSignedIn.get(); 
}); 
+0

你是對的。我的代碼是初始化gapi.auth2的登錄,但我以後不使用GetAuthInstance。任何人閱讀這篇文章都會讓你無法初始化它兩次。你會得到「已經用不同選項初始化」的錯誤。 – beachCode