2017-10-11 1 views
0

verbunden ist, ich bin mit Firebase für die Authentifizierung mit Google. Aber das Problem ist, wenn ich verbunden bin und ich die Seite aktualisiere, möchte ich den Session/CurrentUser erhalten. In der Dokumentation Ich habe das verwenden:Angular 4 - Firebase - Überprüfen Sie, ob der Benutzer

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

Diese Funktion funktioniert, aber das Problem ist, ich weiß nicht, wie tuen eine beobachtbare verwendet das Ende dieser Funktion zu warten. Da diese Funktion einer Ajax-Funktion ähnelt und angular nicht wartet, ist der Wert null, wenn ich den Benutzer auf eine lokale Variable einstelle.

Ich suchte schon in Stackoverflow und ich fand keine Lösung

Danke

+0

können Sie verwenden firebase.auth(). Current zu sehen, ob es bereits für den Anfang verbunden ist. Wenn Sie onAuthStateChanged verwenden möchten, was möchten Sie danach tun? Kannst du den Rest nicht in den if (user) -Block legen? – Carsten

+2

Werfen Sie einen Blick auf angularfire2 –

Antwort

2

Meine Antwort mit @wandrille ‚s Lösung kombiniert:

Sie können Subject statt Observable wie folgt verwenden :

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"); 
    } 
    }); 


} 

in Ihrer Komponente:

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

In Ihrem Beispiel die Variable Benutzer den Benutzer Inhalt wird. Aber wie kann ich diesen Benutzer in meinem Controller zurückgeben? Ich möchte steuern, wenn der Benutzer verbunden ist, und wenn es nicht ich will, dass er ein paar Routen Beschrän – Fasco

+0

@Fasco das Update sehen –

2

Ich schlage vor, Sie angularFire2 zu verwenden:

Sie können einen Service für Ihre Auth Systeme erstellen.

einig Beispiel:

@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...} 
} 

Und Sie haben gerade GetCurrentUser() oder isAuthentificated() in Ihrer Komponente nennen.

+0

I angularFire2 verwenden. Ihre Methode funktioniert, aber das Problem ist, ich möchte überprüfen, ob der aktuelle Benutzer nicht Null in der Steuerung ist. Aber wenn ich das im Controller mache, ist der aktuelle Benutzer immer Null – Fasco

Verwandte Themen