在$ onAuthStateChanged上找到正确的Firebase Auth id_token [英] Finding correct Firebase Auth id_token on $onAuthStateChanged
问题描述
我当前正在使用Angular 1.5.8
,Firebase 3.3.0
和AngularFire 2.0.2
.当我调用$firebaseAuth.$signInWithPopup
时,promise将返回包含firebase.user.idToken
的firebase用户,但是当我调用$onAuthStateChanged
时,firebase用户将不会返回.user
属性.通过$ onAuthStateChanged函数用于服务器身份验证的正确令牌是什么?
I am currently using Angular 1.5.8
, Firebase 3.3.0
, and AngularFire 2.0.2
. When I call $firebaseAuth.$signInWithPopup
, the promise returns with a firebase user that includes firebase.user.idToken
, but when I call $onAuthStateChanged
, firebase user does not return with a .user
property. What is the correct token to use for server authentication from the $onAuthStateChanged function?
我使用了md
属性,但是随后它停止工作并切换为kd
属性,我意识到并不是每个用户都拥有该属性.是_lat
属性吗?它似乎可以这种方式工作,但是我似乎找不到任何相关的文档.还是这不是在验证状态更改上使用令牌的正确方法?有最佳做法吗?这是我从诺言中得到的对象.
I was using the md
property, but then it stopped working and switched to a kd
property and I realized that not every user has that. Is it the _lat
property? It seems to work this way, but I can't seem to find any documentation around it. Or is this not the correct way to be using the token on an Auth State Change? Is there a best practice? Here is the object I have being returned from the promise.
我为该图像表示歉意,但是奇怪的是,如果我使用JSON.stringify(firebaseUser)并进行打印,则会得到一个完全不同的对象,其中firebaseUser.stsTokenManager.accessToken
将为我提供正确的键,但是如果尝试firebaseUser.stsTokenManager.accessToken
表示未定义stsTokenManager
.
I appologize for the image, but what is strange is that if I JSON.stringify(firebaseUser) and print it, I end up with a completely different object where firebaseUser.stsTokenManager.accessToken
would give me the right key, but if I try firebaseUser.stsTokenManager.accessToken
it says that stsTokenManager
is undefined.
{
"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
抓住此密钥的正确方法?
All of the code seems functional now and seems to be working for every user, but I'm wondering, is there a best-practice for this? Should I be using JSON
to convert and then selecting the property from that object? Or is _lat
the proper way to grab this key?
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:
It is not clear what you are trying to do. Do not access obfuscated internal properties as these will change. You already noticed that. The correct way is to call getToken in the onAuthStateChanged listener:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
user.getIdToken().then(function(idToken) {
console.log(idToken);
});
}
});
这篇关于在$ onAuthStateChanged上找到正确的Firebase Auth id_token的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!