-1

Je me connecte avec succès à l'aide de l'authentification Google, mais mon service d'authentification ne renvoie pas le statut de connexion. J'essaye de le lire dans mon garde d'autorisation pour déterminer si je devrais diriger à la page de connexion. J'obtiens l'erreur que _googleAuth est undefined ("TypeError: Impossible de lire la propriété 'isSignedIn' de undefined").Angular 2 obtenant l'état d'authentification Google à partir d'un service

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

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

La méthode de service nommé descriptivement ressemble à ceci:

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

D'autres méthodes de service fonctionnent. Je peux écrire le nom d'utilisateur par exemple. Cependant, lorsque j'essaie d'obtenir le statut (ou le nom d'utilisateur) comme observable, cela ne fonctionne pas.

Pourquoi le service d'authentification du constructeur n'est-il pas suffisant? Je suppose qu'il me manque quelque chose sur l'utilisation des observables.

loadAuth() est appelée dans le constructeur de service:

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

Comment avez-vous initialisé 'this._googleAuth'? –

+0

@RomanC l'a ajouté. thx – beachCode

+0

il échoue quelque part sur les trois premières lignes, vous devriez déboguer. Désolé c'est hors sujet –

Répondre

2

Vérifiez si votre code est en cours d'initialisation gapi.auth2.

Voici ce dont vous aurez besoin pour vérifier le statut de l'authentification Google.

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

Vous avez raison. Mon code initialisait gapi.auth2 pour la connexion mais je n'utilisais pas GetAuthInstance plus tard. La seule ride pour quiconque lit ceci est que vous ne pouvez pas l'initialiser deux fois. Vous obtiendrez l'erreur "déjà initialisée avec différentes options". – beachCode