我正在使用AngularFire创建一个新用户。但是当我签署用户时,我还要求输入名字和姓氏,并在注册后添加该信息。
$firebaseSimpleLogin(fbRef).$createUser($scope.signupData.email, $scope.signupData.password).then(function (user) {
// Add additional information for current user
$firebase(fbRef.child('users').child(user.id).child("name")).$set({
first: $scope.signupData.first_name,
last: $scope.signupData.last_name
}).then(function () {
$rootScope.user = user;
});
});
以上代码有效,它会创建节点fin Firebase(users / user.id / ...)。
问题
当我使用新用户登录时,我会收到用户默认信息:id,email,uid等,但没有名称。如何自动将该数据与用户关联?
答案 0 :(得分:9)
你做不到。 Firebase通过将登录详细信息存储在自己的数据存储中来隐藏登录管理的复杂性。此过程对您的应用程序伪造一无所知,这意味着它不知道您是否或在何处存储任何其他用户信息。它返回它知道的数据作为方便(id,uid,email,md5_hash,provider,firebaseAuthToken)。
取决于您的应用程序,然后获取[u] id并获取您需要的任何特定应用程序用户信息(例如名字,姓氏)。对于Angular应用程序,您希望拥有一个UserProfile服务,该服务在您获得身份验证成功广播后检索您正在查找的数据。
另外,在您的代码段中,请考虑更改
.child(user.id)
到
.child(user.uid)
如果您以后支持Facebook / Twitter / Persona身份验证,这将派上用场。 uid看起来像“simplelogin:1” - 它有助于避免提供商之间不太可能但可能的ID冲突。
答案 1 :(得分:0)
我对此有同样的问题,感觉没有人真正有一个明确的答案(2年)。但这是一个粗略的结构,如何这样的服务看起来像:
app.factory('Auth', function(FURL, $firebaseAuth, $firebaseObject, $rootScope, $window){
var ref = new Firebase(FURL);
var auth = $firebaseAuth(ref);
var Auth = {
user: {},
login: function(user){
return auth.$authWithPassword({
email: user.email,
password: user.password
});
},
signedIn: function(){
return !!Auth.user.provider;
},
logout: function(){
return auth.$unauth;
}
};
// When user auths, store auth data in the user object
auth.$onAuth(function(authData){
if(authData){
angular.copy(authData, Auth.user);
// Set the profile
Auth.user.profile = $firebaseObject(ref.child('profile').child(authData.uid));
Auth.user.profile.$loaded().then(function(profile){
$window.localStorage['gym-key'] = profile.gym.toString();
});
} else {
if(Auth.user && Auth.user.profile){
Auth.user.profile.$destroy();
}
}
});
return Auth;
});