首页 文章

Ionic中的Firebase身份验证无法正常工作

提问于
浏览
1

我正在尝试构建一个执行基本身份验证的离子应用程序 .

我的注册系统正在将数据推送到我的Firebase URL并记录用户,将用户添加到Login and Auth系统,但我的登录没有进行正确的身份验证 . 注意,这只是第一步 - 我的目标是检查用户的UID是否与我在firebaseurl / uids / firebasekey / uid中存储的UID相匹配 . 我收到此错误:

Login Failed! TypeError: Cannot read property 'email' of undefined(…)

这是被捕获的错误 .

即使我知道具有该电子邮件的用户存在于Firebase实例中 .

这是我的LoginCtrl:

.controller('LoginCtrl', ['Auth', '$state', '$location', '$scope', '$rootScope', '$firebaseAuth', '$window',
        function (Auth, $state, $location, $scope, $rootScope, $firebaseAuth, $window) {
            // check session
            //$rootScope.checkSession;
            // Create a callback to handle the result of the authentication

            $scope.user = {
                email: this.email,
                password: this.password
            };

            $scope.validateUser = function (user) {

                $rootScope.show('Please wait.. Authenticating');
                console.log('Please wait.. Authenticating');

                var email = this.user.email;
                var password = this.user.password;

                /* Check user fields*/
                if (!email || !password) {
                    $rootScope.hide();
                    $rootScope.notify('Error', 'Email or Password is incorrect!');
                    return;
                }

                /* All good, let's authentify */
                Auth.$authWithPassword({
                    email: email,
                    password: password
                }).then(function (authData) {
                    console.log(authData);
                    $rootScope.userEmail = user.email;
                    $window.location.href = ('#/app/meals');
                    $rootScope.hide();
                }).catch(function (error) {
                    console.log("Login Failed!", error);
                    if (error.code == 'INVALID_EMAIL') {
                        $rootScope.notify('Invalid Email Address');
                    }
                    else if (error.code == 'INVALID_PASSWORD') {
                        $rootScope.notify('Invalid Password');
                    }
                    else if (error.code == 'INVALID_USER') {
                        $rootScope.notify('Invalid User');
                    }
                    else {
                        $rootScope.notify('Oops something went wrong. Please try again later');
                    }
                    $rootScope.hide();
                    //$rootScope.notify('Error', 'Email or Password is incorrect!');
                });
            };

            this.loginWithGoogle = function loginWithGoogle() {
                Auth.$authWithOAuthPopup('google')
                    .then(function (authData) {
                        $state.go($location.path('app/meals'));
                    });
            };

            this.loginWithFacebook = function loginWithFacebook() {
                Auth.$authWithOAuthPopup('facebook')
                    //Use the authData factory
                    .then(function (authData) {
                        $state.go($location.path('app/meals'));
                    });
            };

        }
    ])

这是我的SignupCtrl:

.controller('SignUpCtrl', [
        '$scope', '$rootScope', '$firebaseAuth', '$window', 'Auth',
        function ($scope, $rootScope, $firebaseAuth, $window, Auth) {

            $scope.user = {
                firstname: this.firstname,
                lastname: this.lastname,
                email: "",
                password: ""
            };
            $scope.createUser = function () {
                var firstname = this.user.firstname;
                var lastname = this.user.lastname;
                var email = this.user.email;
                var password = this.user.password;

                //https://www.firebase.com/docs/web/guide/login/password.html

                if (!email || !password) {
                    $rootScope.notify("Please enter valid credentials");
                    return false;
                }

                $rootScope.show('Please wait.. Registering');
                $rootScope.auth.$createUser(
                    {email: email, password: password})
                    .then(function (user) {
                        console.log('user is created');
                        $rootScope.hide();
                        $rootScope.userEmail = user.email;
                        var usersRef = new Firebase('https://foodsharingapp.firebaseio.com/users');
                        var keyRef = usersRef.push({
                            'uid': user.uid,
                            'email': email,
                            'firstname': firstname,
                            'lastname': lastname
                        });
                        var uidRef = new Firebase('https://foodsharingapp.firebaseio.com/uids/' + user.uid + '/' + keyRef.key());
                        uidRef.set({'registered': true});
                        $window.location.href = ('#/app/meals');
                    }, function (error) {
                        console.log('error unfortunately');
                        $rootScope.hide();
                        if (error.code == 'INVALID_EMAIL') {
                            console.log('invalid email');
                            $rootScope.notify('Invalid Email Address');
                        }
                        else if (error.code == 'EMAIL_TAKEN') {
                            console.log('email taken');
                            $rootScope.notify('Email Address already taken');
                        }
                        else {
                            console.log('not sure what happened');
                            $rootScope.notify('Oops something went wrong. Please try again later');
                        }
                    });

            }

            Auth.$onAuth(function (user) {
                if (user === null) {
                    console.log("Not logged in yet");
                } else {
                    console.log("Logged in as", user.uid);
                }
                $scope.user = user; // This will display the user's name in our view
            });
        }
    ])

这是我的Auth工厂:

app.factory('Auth', ['rootRef', '$firebaseAuth',function(rootRef, $firebaseAuth){
    return $firebaseAuth(rootRef);
}]);

这是我与Auth相关的app.js:

$rootScope.userEmail = null;
            $rootScope.baseUrl = 'https://foodsharingapp.firebaseio.com/';
            var authRef = new Firebase($rootScope.baseUrl);
            $rootScope.auth = $firebaseAuth(authRef);
            $rootScope.authData = authRef.getAuth();


            $rootScope.logout = function() {
                authRef.unauth();
                $rootScope.authDataCallBack;
            };


            $rootScope.checkSession = function() {
                if ($rootScope.authData) {
                    console.log("User " + authData.uid + " is logged in with " + authData.provider);
                    $rootScope.userEmail = user.email;
                    $window.location.href = ('#/app/meals');
                } else {
                    console.log("No session so logout");
                    $rootScope.userEmail = null;
                    $window.location.href = '#/auth/signin';
                }
            }

            $rootScope.authDataCallBack = function(authData) {
                if ($rootScope.authData) {
                    console.log("User " + authData.uid + " is logged in with " + authData.provider);
                } else {
                    console.log("User is logged out");
                    $window.location.href = '#/auth/signin';
                }
            };

            //Listens for changes
            authRef.onAuth($rootScope.authDataCallback);

注意,另一个问题是app.js函数中的onAuth函数不起作用 .

我应该如何清理我的代码?我究竟做错了什么?我正在使用一堆教程等,我认为没有正确的方法 .

2 回答

  • 0

    我已经弄明白了这个问题 .

    $rootScope.userEmail = user.email;

    user 实际上未定义为变量时(虽然已经定义了 $scope.user ),我正在调用此行 .

  • 1

    登录控制器代码

    function ($scope, $stateParams,  $firebaseAuth, $state) {
    
            $scope.user = {
                'email': '',
                'password': ''
            };
    
            $scope.signIn = function(){
                $scope.errorBox = '';
                const promise = firebase.auth().signInWithEmailAndPassword($scope.user.email, $scope.user.password);
                promise.then(resp => {
    
                    $state.go('zazzycoinsActivities');
                })
                .catch(err => {
                  $scope.$apply(function(){
                     $scope.errorBox = err.message;
                  });
                });
            };
    
        }
    

    这也许对你有用它对我有用......

相关问题