路由前如何检查令牌有效性?

时间:2019-05-04 08:22:16

标签: node.js angularjs express jwt ngroute

我正在用后端的angularjs路由(ngRoute)和expressjs设置一个Web应用程序。

我很怀疑,我不明白为什么检查用户是否登录的“标准”解决方案是在本地存储中查找令牌。我的意思是,任何时候都不会检查其有效性。用户可以在浏览器中手动插入令牌。

我知道,当用户尝试执行操作服务器端会意识到该用户未登录,但是我认为对于手动将令牌插入< strong>访问一些私人路线(例如,创建表单)。

我不知道如何解决此问题。 我试图向服务器询问应用程序运行中的有效性。问题在于程序在第一次路由之前不会等待promise。

var appRun = function($rootScope, $location, $route, $timeout, API_URL, auth, authToken) {
    //running...
    auth.getProfile();

    $rootScope.$on('$locationChangeStart', function(event, next, current) {
      var routeUrl = '/' + current.replace(API_URL, '').split('/')[1];
      routeUrl = getRouteParams(routeUrl);

      var routeObj = $route.routes[routeUrl];
      var userProfile = authToken.isAuthenticated(), redirectPath;

      //not valid route
      if (!routeObj) {
        redirectPath = getRedirectPath(userProfile);
        $location.path(redirectPath);
      }

      //restricted route
      else if (routeObj.restricted && userProfile !== 'LOGGED') {
        redirectPath = getRedirectPath(userProfile);
        $location.path(redirectPath);
      }
      ...
   }
}
//In auth service...
 ...

 getProfile: function() {
        if (!(!!authToken.getToken())) { 
            return authToken.setUserProfile('FORBIDDEN') 
        }

        //if the token exists check it
        return $http.get(API_URL + '/auth')
          .then(function(response) {
            authToken.setUserProfile(response.data.status);
            return response;
          })
          .catch(function(error) {
            return authToken.setUserProfile(error.data.message);
          });
      }

  ...

1 个答案:

答案 0 :(得分:0)

不要转换被拒绝的承诺

为什么在Stackoverflow上有如此多的示例将拒绝的承诺转换为已实现的承诺

//In auth service...
 ...

 getProfile: function() {
        if (!(!!authToken.getToken())) { 
            ̶ ̶r̶e̶t̶u̶r̶n̶ ̶a̶u̶t̶h̶T̶o̶k̶e̶n̶.̶s̶e̶t̶U̶s̶e̶r̶P̶r̶o̶f̶i̶l̶e̶(̶'̶F̶O̶R̶B̶I̶D̶D̶E̶N̶'̶)̶ 
             authToken.setUserProfile('FORBIDDEN') 
             return $q.reject("FORBIDDEN - No token");
        }

        //if the token exists check it
        return $http.get(API_URL + '/auth')
          .then(function(response) {
            authToken.setUserProfile(response.data.status);
            return response;
          })
          .catch(function(error) {
            ̶r̶e̶t̶u̶r̶n̶ ̶a̶u̶t̶h̶T̶o̶k̶e̶n̶.̶s̶e̶t̶U̶s̶e̶r̶P̶r̶o̶f̶i̶l̶e̶(̶e̶r̶r̶o̶r̶.̶d̶a̶t̶a̶.̶m̶e̶s̶s̶a̶g̶e̶)̶;̶
            authToken.setUserProfile(error.data.message);
            //RE-THROW rejected promises
            throw error;
          });
      }

当承诺错误处理程序returns为一个值时,$ q服务将被拒绝的承诺转换已实现的承诺。要保留拒绝状态,请re-throw原因或返回 rejected 承诺。

似乎有人采用了名为getProfile的函数,并对其进行了黑化以增加副作用。他们没有使用Profile承诺,而是放弃了承诺并使用了副作用。

返回被拒绝的路由解析承诺

返回拒绝的诺言的函数可用于路由解析函数中止加载路由:

app.config(function($routeProvider, $locationProvider) {
    $routeProvider
    .when('/Book/:bookId', {
        templateUrl: 'book.html',
        controller: 'BookController',
        resolve: {
            profile: function(auth) {
                return auth.getProfile();
            }
        }
    })
})

auth.getProfile()函数返回拒绝的诺言时,ngRoute路由器会中止视图的加载并广播$routeChangeError事件。

有关更多信息,请参见