Javascript 角度认证

Javascript 角度认证,javascript,php,angularjs,authentication,routing,Javascript,Php,Angularjs,Authentication,Routing,问题出在每个$routeChangeStart上,如果找不到用户,如果我只键入url,它仍会将我指向页面 现在我已经在服务器上重写了规则 Options +FollowSymlinks RewriteEngine On # Don't rewrite files or directories RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] Rewrite

问题出在每个$routeChangeStart上,如果找不到用户,如果我只键入url,它仍会将我指向页面

现在我已经在服务器上重写了规则

Options +FollowSymlinks
RewriteEngine On
# Don't rewrite files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule (.*) /index.html [L]
下面是app.js

var app = angular.module('myApp', ['ngRoute']);
app.config(function($httpProvider){


    // attach our Auth interceptor to the http requests
    $httpProvider.interceptors.push('AuthInterceptor');


});


app.run(['$rootScope','$scope','Auth', '$location', function($rootScope, $scope, Auth, $location){
     $rootScope.$on('$routeChangeStart', function(event){
        $scope.loggedIn = Auth.isLoggedIn();
        console.log(Auth.isLoggedIn());

        Auth.getUser().then(function(response){
            console.log(response);
            $scope.user = response;
        }).catch(function(error){
            console.log(error);
        });

    });
}]);
这是我的授权工厂

app.factory('AuthToken', function($window){

    var authTokenFactory = {};

    authTokenFactory.setToken = function(token){
        if(token){
            $window.localStorage.setItem('token', token);
        }else{
            $window.localStorage.removeItem('token');
        }
    };

    authTokenFactory.getToken = function(){
        return $window.localStorage.getItem('token');
    }

    return authTokenFactory;
});


app.factory('Auth', function($http, $q, AuthToken, Passingtoken){

    var authFactory = {};

    authFactory.login = function(email, password){
        var data = {
            email: email,
            password: password
        };

        return $http.post('/loginForm.php', JSON.stringify(data)).then(function(response){
           // console.log(response);
            AuthToken.setToken(response.data);
            return response;
        }).catch(function(e){
            console.log(e);
            return $q.reject(e.data);
        });
    };


    authFactory.logout = function(){
        AuthToken.setToken();
    };

    authFactory.isLoggedIn = function(){
        if(AuthToken.getToken()){
            return true;
        }else{
            return false;
        }
    };

    authFactory.getUser = function(){
        var defer = $q.defer();
        if(AuthToken.getToken()){
            var userdata = JSON.parse(Passingtoken.getUserData());
            userdata = userdata[0].data;
            console.log(userdata);

            /**
             * get the token. Might make this a service that just gets me this token when needed.
             */
            $http.post('/decode.php', {
                userdata
            }).then(function(response){
                console.log(response.data.rows[0]);
                //$scope.username = response.data.rows[0].fullname;
                defer.resolve(response.data.rows[0]);
            }, function(e){
                console.log(e);
            });
        }else{
            return $q.reject({
                message: 'User not found'
            });
        }
        return defer.promise;
    };


    return authFactory;
});


app.factory('AuthInterceptor', function($q, $location, AuthToken){

    var interceptorFactory = {};

    interceptorFactory.request = function(config){
        // grab a token
        var token = AuthToken.getToken();
        // if token is there added to header
        if(token){
            config.headers['x-access-token'] = token;
        }

        return config;
    };

    interceptorFactory.responseError = function (response) {

        if (response.status == 403){   
            AuthToken.setToken();
            $location.path('/login');
        }
        return $q.reject(response);

    };


    return interceptorFactory;
});
这里是主控台,我正在检查路线变更

app.controller('mainCtrl', ['$scope', 'Passingtoken', '$http','$window', 'Auth', '$location', '$rootScope', function($scope, Passingtoken, $http, $window, Auth, $location, $rootScope){

    // check for loggin in
    $scope.loggedIn = Auth.isLoggedIn();

    // rootscope
    $rootScope.$on('$routeChangeStart', function(event){
        $scope.loggedIn = Auth.isLoggedIn();
        console.log(Auth.isLoggedIn());

        Auth.getUser().then(function(response){
            console.log(response);
            $scope.user = response;
        }).catch(function(error){

            console.log(error);
        });

    });


     $scope.logged = function(){
        if($scope.loginData.email !== '' && $scope.loginData.password !== ''){
            Auth.login($scope.loginData.email, $scope.loginData.password).then(function(response){
                //console.log(response);
                if(response.data !== 'failed'){
                    Passingtoken.addData(response);
                    $location.path("/home");
                    //$window.location.reload();
                }else{

                }
            }, function(e){
                console.log(e);
            });
        }
    };



    /**
     * Logout function
     */
    $scope.logout = function(){
        Auth.logout();

        $scope.username = "";
        $location.path("/");
    }

}]);
在$rootscope.on中,我检查用户是否有令牌,如果用户有令牌,则路由可以更改(我使用的是jwt),但如果我通过url,则即使我没有令牌,它也会将我带到任何地方。在我的主控制器中,我尝试在.catch()中添加$location.path(“/”),然后在每次路由更改时,它都会将我带到该路径,即使我没有登录,并尝试单击登录,它会将我重定向到该路径,这是有意义的。我只是不知道如何确保用户不能通过url进入,并且应该检查每个请求。任何帮助都将不胜感激


提前感谢

将这部分代码移动到应用程序的运行块中

$rootScope.$on('$routeChangeStart', function(event){
        $scope.loggedIn = Auth.isLoggedIn();
        console.log(Auth.isLoggedIn());

        Auth.getUser().then(function(response){
            console.log(response);
            $scope.user = response;
        }).catch(function(error){

            console.log(error);
        });

    });

您应该将
$on('$routeChangeStart')
调用移动到主应用程序模块的
运行中
section@Phil我根本不用跑步区,我想说的是你should@Phil我在我的app.js中添加了一个run方法,正如您在上面的示例中看到的,但它仍然不起作用。我在app.js中添加了.run模块,但如果我通过url,我仍然可以访问这些页面