【发布时间】:2017-02-09 12:11:47
【问题描述】:
我目前正在使用Angular 1.5.8、Firebase 3.3.0 和AngularFire 2.0.2。当我调用$firebaseAuth.$signInWithPopup 时,promise 会返回一个包含firebase.user.idToken 的firebase 用户,但是当我调用$onAuthStateChanged 时,firebase 用户不会返回一个.user 属性。 $onAuthStateChanged 函数用于服务器身份验证的正确令牌是什么?
我使用的是md 属性,但后来它停止工作并切换到kd 属性,我意识到并非每个用户都拥有它。是_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 进行转换,然后从该对象中选择属性吗?还是_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
【问题讨论】:
-
我们正在使用哪些版本?我认为这是 AngularFire,但这里甚至没有提到。
-
今天拉的最新版本。我的仓库位于 GitHub.com/LukeSchlangen/nodeFire
-
Angular 1.5.8、Firebase 3.3.0 和 AngularFire 2.0.2。
-
refreshToken应该在用户对象上,以便您可以像这样访问它:firebaseAuth.user.refreshToken。结帐firebase.google.com/docs/reference/js/… 和firebase.google.com/docs/reference/js/firebase.User -
谢谢伊丹。看起来firebase在您包含的链接上建议不要这样做? “用户帐户的刷新令牌。仅用于需要显式刷新令牌的高级方案。”
标签: firebase firebase-authentication angularfire