2017-10-11 2 views
0

J'utilise Firebase pour l'authentification avec Google. Mais le problème est quand je suis connecté et que j'actualise la page, je voudrais obtenir le Session/CurrentUser. Dans la documentation que je dois utiliser que:Angular 4 - Firebase - Vérifiez si l'utilisateur est connecté

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    console.log(user) 
    // User is signed in. 
    } else { 
    // No user is signed in. 
    } 
}); 

Cette fonction fonctionne, mais le problème est que je ne sais pas comment tu utiliser une observable à attendre la fin de cette fonction. Parce que cette fonction est similaire à une fonction ajax, et angular n'attend pas, donc si je mets l'utilisateur dans une variable locale, ce sera null.

je l'ai déjà recherché dans stackoverflow et je ne trouve pas une solution

Merci

+0

Vous pouvez utiliser firebase.auth(). CurrentUser pour voir s'il est déjà connecté pour les démarreurs. Si vous voulez utiliser onAuthStateChanged, que voulez-vous qu'il se passe après? Tu ne peux pas mettre le reste dans le bloc if (user)? – Carsten

+2

Jetez un coup d'œil à angularfire2 –

Répondre

2

cette Ma réponse combinée avec une solution d » @wandrille de:

Vous pouvez utiliser Subject à la place Observable comme celui-ci :

import { Subject } from "rxjs/Subject"; 

class AuthService{ 
    public connectionSubject : Subject<string>() = new Subject<string>(); 

    firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
     console.log(user) 
     this.connectionSubject.next({ state : "connected", user}); 
    } else { 
     this.connectionSubject.next("disconnected"); 
    } 
    }); 


} 

dans votre composant:

@Component({ 
    //... 
    }) 
    class YourComponent{ 
     constructor(private authService: AuthService){ 
     } 
     ngOnInit(){ 
     this.authService.connectionSubject.subscribe((data) => { 
      if(data.state === 'connected'){ 
       console.log(data.user); 
      }else{ 
       //... 
      } 
     }); 
     } 
    } 
+0

Dans votre exemple, l'utilisateur de variable contentera l'utilisateur. Mais comment puis-je retourner cet utilisateur dans mon contrôleur? Je veux contrôler si l'utilisateur est connecté et si ce n'est pas le cas je veux lui restreindre certaines routes – Fasco

+0

@Fasco voir la mise à jour –

2

Je vous suggère d'utiliser angularFire2:

Vous pouvez créer un service pour votre Auth A.

quelques exemples:

@Injectable() 
export class AuthService { 

    public firebaseUser : Observable <firebase.User>; 
    public currentUser : firebase.User; 

    constructor(public afAuth : AngularFireAuth) { 

    this.firebaseUser = this.afAuth.authState 

    } 

    isAuthentificated() { 
    return this.firebaseUser 
    } 

    getCurrentUSer() { 
    return this.afAuth.auth.currentUser 
    } 

    loginUser({email, password}){...some code...} 
} 

Et vous venez d'appeler getCurrentUser() ou isAuthentificated() dans votre composant.

+0

J'utilise angularFire2. Votre méthode fonctionne mais le problème est que je veux vérifier si le currentUser n'est pas nul dans le contrôleur. Mais si je fais cela dans le contrôleur, l'utilisateur courant est toujours null – Fasco