Как проверить правильность токена перед маршрутизацией? - PullRequest
0 голосов
/ 04 мая 2019

Я настраиваю веб-приложение с маршрутизацией angularjs (ngRoute) и expressjs в бэкэнде.

У меня есть сомнение, Я не понимаю, почему «стандартное» решение для проверки, зарегистрирован ли пользователь или нет, ищет токен в локальном хранилище . Я имею в виду, его действительность не проверяется в любое время . Пользователь может вручную вставить токен в браузер.

Мне известно, что когда пользователь пытается выполнить операцию , серверная сторона понимает, что пользователь не зарегистрирован , но я думаю, что все еще возможно для пользователя, который вручную вставляет токен в доступ к некоторым личным маршрутам (например, форма создания).

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

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 голосов
/ 04 мая 2019

Не преобразовывать отклоненные обещания

Почему так много примеров в 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;
          });
      }

Когда обработчик ошибок обещания возвращает значение, служба $ q преобразует отклоненное обещание в выполненное обещание.Чтобы сохранить отклоненное состояние, либо повторно выбросьте причину, либо верните отклоненное обещание.

Похоже, кто-то взял функцию с именем 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 событие.

Для получения дополнительной информации см.

...