我目前正在使用Angular 1.5.8
,Firebase 3.3.0
和AngularFire 2.0.2
。当我调用$firebaseAuth.$signInWithPopup
时,承诺将返回包含firebase.user.idToken
的firebase用户,但是当我调用$onAuthStateChanged
时,firebase用户不会返回.user
属性。从$ onAuthStateChanged函数用于服务器身份验证的正确令牌是什么?
我正在使用md
属性,但随后它停止工作并切换到kd
属性,我意识到并非每个用户都有。是_lat
属性吗?它似乎以这种方式工作,但我似乎无法找到任何有关它的文档。或者这不是在Auth State Change上使用令牌的正确方法吗?有最好的做法吗?这是我从诺言中回来的对象。
我为图片道歉,但奇怪的是,如果我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
找到答案 0 :(得分:13)
目前尚不清楚你要做什么。不要访问混淆的内部属性,因为这些属性会发生变化。你已经注意到了。正确的方法是在onAuthStateChanged侦听器中调用getToken:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
user.getIdToken().then(function(idToken) {
console.log(idToken);
});
}
});