2016-09-30 5 views
7

Ich verwende derzeit Angular 1.5.8, Firebase 3.3.0 und AngularFire 2.0.2. Wenn ich $firebaseAuth.$signInWithPopup aufrufen, wird das Versprechen mit einem Firebase-Benutzer zurückgegeben, der firebase.user.idToken enthält, aber wenn ich $onAuthStateChanged aufrufen, wird Firebase-Benutzer nicht mit einer .user Eigenschaft zurückgegeben. Was ist das richtige Token für die Server-Authentifizierung von der $ onAuthStateChanged-Funktion?

Ich benutzte die md Eigenschaft, aber dann hörte es auf zu arbeiten und wechselte zu einer kd Eigenschaft und ich erkannte, dass nicht jeder Benutzer das hat. Ist es die _lat Eigenschaft? Es scheint so zu funktionieren, aber ich kann keine Dokumentation darüber finden. Oder ist das nicht der richtige Weg, das Token für einen Auth State Change zu verwenden? Gibt es eine Best Practice? Hier ist das Objekt, das ich von dem Versprechen zurückgegeben habe.

enter image description here

ich für das Bild appologize, aber seltsam, was ist, wenn ich JSON.stringify (firebaseUser) und ausdrucken, ich mit einem völlig anderen Objekt landen, wo firebaseUser.stsTokenManager.accessToken mir den richtigen Schlüssel geben würde, aber wenn ich versuche firebaseUser.stsTokenManager.accessToken es heißt, dass stsTokenManager ist undefiniert.

{ 
    "uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "displayName": "Luke Schlangen", 
    "photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "email": "[email protected]", 
    "emailVerified": true, 
    "isAnonymous": false, 
    "providerData": [ 
    { 
     "uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
     "displayName": "Luke Schlangen", 
     "photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
     "email": "[email protected]", 
     "providerId": "google.com" 
    } 
    ], 
    "apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "appName": "[DEFAULT]", 
    "authDomain": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "stsTokenManager": { 
    "apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "refreshToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "accessToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "expirationTime": XXXXXXXXXXXXXXXXXXXXXXXXXX 
    }, 
    "redirectEventId": null 
} 

gesamte Code scheint jetzt funktional und scheint für jeden Benutzer zu arbeiten, aber ich frage mich, ist es ein Best-Practice für das? Sollte ich JSON verwenden, um die Eigenschaft von diesem Objekt zu konvertieren und dann auszuwählen? Oder ist _lat der richtige Weg, um diesen Schlüssel zu greifen?

var app = angular.module("sampleApp", ["firebase"]); 
app.controller("SampleCtrl", function($scope, $firebaseArray, 

$firebaseAuth, $http) { 
    var auth = $firebaseAuth(); 

    $scope.logIn = function login(){ 
    auth.$signInWithPopup("google").then(function(firebaseUser) { 
     console.log("Signed in as:", firebaseUser.user.displayName); 
    }).catch(function(error) { 
     console.log("Authentication failed: ", error); 
    }); 
    }; 

    auth.$onAuthStateChanged(function(firebaseUser){ 
    // firebaseUser will be null if not logged in 
    if(firebaseUser) { 
     // This is where we make our call to our server 
     $http({ 
     method: 'GET', 
     url: '/secretData', 
     headers: { 
      id_token: firebaseUser._lat 
     } 
     }).then(function(response){ 
     $scope.secretData = response.data; 
     }); 
    }else{ 
     console.log('Not logged in.'); 
     $scope.secretData = "Log in to get some secret data." 
    } 

    }); 

    $scope.logOut = function(){ 
    auth.$signOut().then(function(){ 
     console.log('Logging the user out!'); 
    }); 
    }; 
}); 

Der vollständige Code kann bei github

+0

Mit welchen Versionen arbeiten wir? Ich nehme an, dies ist AngularFire, aber es wird hier nicht einmal erwähnt. – Kato

+0

Die neuesten Versionen gezogen heute. Mein Repo ist unter GitHub.com/LukeSchlangen/nodeFire –

+2

Angular 1.5.8, Firebase 3.3.0 und AngularFire 2.0.2. – Kato

Antwort

8

Es ist nicht klar, was Sie zu tun versuchen zu finden. Greifen Sie nicht auf verschleierte interne Eigenschaften zu, da sich diese ändern. Das hast du schon bemerkt. Der korrekte Weg besteht darin, getToken im onAuthStateChanged-Listener aufzurufen:

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    user.getIdToken().then(function(idToken) { 
     console.log(idToken); 
    }); 
    } 
}); 
+0

Firebase.User.prototype.getToken ist veraltet. Verwenden Sie stattdessen firebase.User.prototype.getIdToken. – flashsnake

+0

Ich habe die Antwort aktualisiert. – bojeil

Verwandte Themen