Не удается автоматически войти в систему пользователя после создания учетной записи в AngularFire

#angularjs #firebase #angularfire #firebasesimplelogin

# #angularjs #firebase #angularfire #firebasesimplelogin

Вопрос:

Здравствуйте, я использую AngularJS Firebase с Angular Fire, пытаясь создать простое приложение для блога, похожее на tumblr, чтобы узнать все тонкости AngularJS. Не используя какие-либо угловые начальные значения или не переходя к конкретному руководству, просто изучаю вещи, как мне нужно.

У меня работает простая система входа в систему $ firebase. Я создал простую форму регистрации пользователя, и когда пользователь отправляет, я запускаю $CreateUser(), который работает, а затем загружаю все данные профиля, которые пользователь вводит в набор данных с помощью user.id возвращается обещанием CreateUser. В документе API говорится, что их аргумент, оставленный пустым, автоматически регистрирует пользователя после создания, однако я прочитал в нескольких местах, что это было удалено, и документ остался не обновленным. Также в обычном API Firebase упоминается, что пользователь должен войти в систему после создания учетной записи. Я попытался запустить метод $login() внутри возвращенного обещания создания учетной записи следующим образом:

 $scope.signUp = function(newuser){
                var userData = newuser;
                var userRef = new Firebase(FB_URL 'users');
                $scope.users = $firebase(userRef); //oooohhhhhh
                $rootScope.loginObj.$createUser(newuser.email,newuser.password).then(function(user){
                    var child = $scope.users.$child(user.id);
                    child.$set({name:userData.fullname,email:userData.email});
                    $rootScope.loginObj.$login('password',userData.email,userData.password).then(function(user,error){
                        $location.path('/home');
                    },function(error){
                        console.log(error);
                    });
                    //$rootScope.loginObj.user = user;
                    //$rootScope.currentUser = user;
                    //$location.path('/home');
                    //$rootScope.loginObj.$login('password', userData.email, userData.password).then(function(user){
                    //  $location.path('/home');
                    //},function(error){
                    //  console.log(error);
                    //});
                },function(error){
                    console.log(error);
                });
            };
 

И он выдает мне эту ошибку:

         Error {code: "UNKNOWN_ERROR", data: Object, stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: A…ple-login/1.5.0/firebase-simple-login.js:188:231)", message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."}
code: "UNKNOWN_ERROR"
data: Object
message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."
stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred.↵    at Error (native)↵    at Object.fb.simplelogin.Errors.format (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:33:294)↵    at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:275↵    at fb.simplelogin.providers.Password_.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:90:196)↵    at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:209↵    at r (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:151)↵    at new n (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:79)↵    at fb.simplelogin.client.loginWithPassword (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:81)↵    at fb.simplelogin.client.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:173:85)↵    at Object.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:188:231)"
get stack: function () { [native code] }
set stack: function () { [native code] }
__proto__: d
 

Я также попытался вызвать метод, который я создал внутри контроллера, который похож на $scope.login(email, password), но это тоже не сработало. Когда пользователь регистрируется, предполагается, что он переходит к домашнему просмотру, который ограничен зарегистрированными пользователями. если пользователь не прошел проверку подлинности, он возвращает их обратно в представление входа. Итак, как и сейчас, пользователь создает свою учетную запись, затем перенаправляется в / home, они не отображаются как аутентифицированные, а затем возвращаются к логину.
Моя конфигурация маршрутизатора:

 app.config(['$routeProvider', '$locationProvider', 
    function($routeProvider, $locationProvider) {
  $routeProvider
   .when('/admin', {
    templateUrl: 'admin.html',
    controller: 'AdminController',
    needsAuth: true
  })
  .when('/home', {
    templateUrl: 'home.html',
    controller: 'HomeController',
    needsAuth: true
  })
  .when('/login', {
    templateUrl: 'app/html/login-form.html',
    controller: 'LogInController',
    needsAuth: false
  })
  .otherwise({redirectTo: '/home'});
}]); 
 

И вот логика, которая проверяет, аутентифицирован ли пользователь после запуска routechange:

 app.run(function ($rootScope, $firebaseSimpleLogin, $location) {
    $rootScope.$on('$routeChangeStart', function (event, next, $firebaseSimpleLogin, $scope, $rootScope) {
        //console.log(event.targetScope);

        console.log(event.targetScope.currentUser);
        event.targetScope.loginObj.$getCurrentUser().then(function(user){ 

            var userAuthenticated = null;
            if (user || event.targetScope.currentUser)
                var userAuthenticated =  true;

            //console.log(userAuthenticated);
            if(!userAuthenticated amp;amp; next.needsAuth){
                $location.path('/login');
            }
        }, function(error){
            console.log(error);

        });
    });
 

Я попытался обойти проблему, создав отдельную переменную с именем CurrentUser и загрузив в нее пользовательские данные, возвращаемые функцией CreateUser, а затем проверяя это тоже, когда он переводит их в домашний вид. И это работает, но затем, если пользователь обновляет, они теряют эту информацию, потому что она не сохраняется в сеансе, который, как я предполагаю, делает $login .

Ответ №1:

Второй аргумент для $login — это не адрес электронной почты и пароль (например, CreateUser), а объект; тот же API, что и основной метод FirebaseSimpleLogin.

Итак, этот код:

 $rootScope.loginObj.$login('password',userData.email,userData.password).then(...)
 

Должно выглядеть примерно так:

 var options = {email: userData.email, password: userData.password};
$rootScope.loginObj.$login('password', options).then(...)
 

Смотрите Документы API в разделе $login для получения более подробной информации и примеров.