在 $onAuthStateChanged 上找到正确的 Firebase Auth id_token

Finding correct Firebase Auth id_token on $onAuthStateChanged

我目前正在使用 Angular 1.5.8Firebase 3.3.0AngularFire 2.0.2。当我调用 $firebaseAuth.$signInWithPopup 时,承诺 return 包含 firebase.user.idToken 的 firebase 用户,但是当我调用 $onAuthStateChanged 时,firebase 用户不会 return .user属性。 $onAuthStateChanged 函数用于服务器身份验证的正确令牌是什么?

我正在使用 md 属性,但后来它停止工作并切换到 kd 属性,我意识到并非每个用户都拥有它。是 _lat 属性 吗?它似乎以这种方式工作,但我似乎找不到任何相关文档。或者这不是在 Auth State Change 上使用令牌的正确方法吗?有最佳实践吗?这是我从承诺中 return 得到的对象。

我为图像道歉,但奇怪的是,如果我 JSON.stringify(firebaseUser) 并打印它,我最终会得到一个完全不同的对象,其中 firebaseUser.stsTokenManager.accessToken 会给我正确的键,但是如果我尝试 firebaseUser.stsTokenManager.accessToken 它说 stsTokenManager 是未定义的。

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

所有代码现在似乎都可以使用,而且似乎对每个用户都适用,但我想知道,是否有最佳实践?我应该使用 JSON 进行转换,然后从该对象中选择 属性 吗?还是 _lat 获取此密钥的正确方法?

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!');
    });
  };
});

完整代码可以在 github

找到

不清楚您要做什么。不要访问混淆的内部属性,因为它们会发生变化。你已经注意到了。正确的方法是在onAuthStateChanged监听器中调用getToken:

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