在$onAuthStateChanged上查找正确的Firebase身份验证id_令牌

在$onAuthStateChanged上查找正确的Firebase身份验证id_令牌,firebase,firebase-authentication,angularfire,Firebase,Firebase Authentication,Angularfire,我目前使用的是angular1.5.8、Firebase 3.3.0和AngularFire 2.0.2。当我调用$firebaseAuth.$signInWithPopup时,承诺将返回一个包含firebase.user.idToken的firebase用户,但当我调用$onAuthStateChanged时,firebase用户不会返回.user属性。$onAuthStateChanged函数中用于服务器身份验证的正确令牌是什么 我使用的是md属性,但后来它停止工作并切换到kd属性,我意识到

我目前使用的是
angular1.5.8
Firebase 3.3.0
AngularFire 2.0.2
。当我调用
$firebaseAuth.$signInWithPopup
时,承诺将返回一个包含
firebase.user.idToken
的firebase用户,但当我调用
$onAuthStateChanged
时,firebase用户不会返回
.user
属性。$onAuthStateChanged函数中用于服务器身份验证的正确令牌是什么

我使用的是
md
属性,但后来它停止工作并切换到
kd
属性,我意识到并不是每个用户都有这个属性。它是
\u lat
属性吗?它似乎是这样工作的,但我似乎找不到任何关于它的文档。或者这不是在身份验证状态更改时使用令牌的正确方法吗?是否有最佳实践?这是我从承诺中得到的东西

我对图像表示赞同,但奇怪的是,如果我使用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
进行转换,然后从该对象中选择属性吗?还是用
\u 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!');
    });
  };
});

完整的代码可以在

上找到,不清楚您想做什么。不要访问模糊的内部属性,因为这些属性将发生更改。你已经注意到了。正确的方法是在onAuthStateChanged侦听器中调用getToken:

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

我们使用的是什么版本?我猜这是AngularFire,但这里没有提到。最新版本今天发布。我的repo位于GitHub.com/LukeSchlangen/nodeFireAngular 1.5.8、Firebase 3.3.0和AngularFire 2.0.2。
refreshToken
应该位于用户对象上,这样您就可以像这样访问它:
firebaseAuth.user.refreshToken
。结账,谢谢你,伊丹。看起来firebase建议不要在您包含的链接上使用该选项?“用户帐户的刷新令牌。仅用于需要显式刷新令牌的高级方案。”不推荐使用firebase.user.prototype.getToken。请改用firebase.User.prototype.getIdToken.Dat“。然后“。。。在我的VueJS应用程序中工作!Thanx很多:)