2015-09-20 118 views
0

問題是,如果用戶沒有有效的JWT,我想限制對特定路由的訪問並顯示登錄頁面。我只想告訴我,在AngularJs和NodeJs中我很新。因此,在短期我有AngularJs路由認證

LoginCtrl:

$scope.login = function(username, password){ 

UserSvc.login(username, password) 
.then(function(response){ 
    $scope.$emit('login', response.data); 
    $window.location.href = '#/'; 
}, function(resp){ 
    $scope.loginError = resp.data.errors; 
});  
} 

我上升的事件,在ApplicationCtrl該事件由該

$scope.$on('login', function(_, user){ 
    $scope.currentUser = user 
}) 

這是很酷,它的工作完美擦肩而過,問題是,我在我的route.js中有一些路線,我想對其進行一些驗證。

$routeProvider 
.when('/', {controller:'PostsCtrl', templateUrl: 'posts.html'}) 
.when('/register', {controller:'RegisterCtrl', templateUrl: 'register.html'}) 
.when('/login', {controller:'LoginCtrl', templateUrl: 'login.html'}) 
.otherwise({redirectTo: '/login'}); 

在nodejs中我可以很容易地放置一箇中間件,但我怎麼能在AngularJs中做到這一點。所以現在發生的事情是,當我登陸頁面時,我可以按登錄。它將我重定向到登錄頁面,然後當我按Posts時,Nodejs返回401,因爲我沒有有效的JWT,但僅在控制檯中顯示。 AngulrJs沒有做任何事情。

+1

你正在尋找的答案是攔截器。檢查這個模塊的角度。 https://github.com/witoldsz/angular-http-auth它從服務器捕獲錯誤401,併爲您提供選項。 – SayusiAndo

回答

1

由於@SayusiAndo指出你需要:

  • http interceptor,將捕獲的401個狀態,從你節點服務器。
  • 然後,如果未登錄,則將用戶重定向到/登錄路由。
  • 此外,您應該使用相同的攔截器發送您的jwt令牌(您應該存儲)。

的Http攔截:

app.factory('AuthInterceptor', function ($window, $q) { 
return { 
    request: function(config) { 
     var token = $window.localStorage.getItem('token'); 
     if(token){ 
      config.headers.Authorization = 'Bearer ' + token; 
     } 

     return config; 
    }, 
    response: function(response) { 
     if (response.status === 401) { 
      // redirect to login. 
     } 
     return response || $q.when(response); 
    } 
}; 
}); 

// Register the AuthInterceptor. 
app.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('AuthInterceptor'); 
}); 
+0

謝謝你的回答,只有一件事401似乎沒有迴應,我能夠在responseError中進行訪問。 – Alex

0

您可以使用$ routeChangeStart事件,每次角度進入路由時都會觸發此事件。附加一個處理程序到這個事件,並在處理程序做你需要的驗證,如果失敗,重定向用戶。

https://docs.angularjs.org/api/ngRoute/service/ $路線