2014-02-19 2 views
5

Я создаю нового пользователя с AngularFire. Но когда я подписываю пользователя, я также прошу имя и фамилию, и я добавляю эту информацию после регистрации.Firebase/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; 
    }); 
}); 

Приведенный выше код работает, он создает узел Firebase узла (users/user.id/...).

Проблема

Когда я войти в систему с новым пользователем, я получаю информацию пользователя по умолчанию: идентификатор, электронная почта, UID и т.д., но без имени. Как я могу автоматически связать эти данные с пользователем?

ответ

9

Вы не можете. Firebase скрывает сложность управления входами, сохраняя данные для входа в свой собственный хранилище данных. Этот процесс ничего не знает о кузнице вашего приложения, а это означает, что он не знает, хранит ли какая-либо дополнительную пользовательскую информацию или где вы ее храните. Он возвращает данные, о которых он знает, в качестве удобства (id, uid, email, md5_hash, provider, firebaseAuthToken).

Это зависит от вашего приложения, чтобы затем взять идентификатор [u] и захватить любую необходимую вам информацию о пользователе (например, имя, фамилию). Для приложения с угловым выражением вы хотите иметь службу UserProfile, которая извлекает данные, которые вы ищете, после того, как вы получите широковещательную проверку подлинности.

Кроме того, в вашем фрагменте кода, рассмотреть вопрос об изменении

.child(user.id) 

в

.child(user.uid) 

это пригодится, если вы когда-либо поддержки аутентификации Facebook/Twitter/Persona позже. uid выглядит как «simplelogin: 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; 
}); 
Смежные вопросы