AngularJS: Как проверить аутентификацию из API, используя Transition Hooks UI-Router? - PullRequest
0 голосов
/ 29 мая 2018

Как заставить обработчик перехода ждать, пока запрос checkAuth() от моего API завершится неудачей, прежде чем он перенаправит пользователя на страницу входа без успешного разрешения обработчика перехода?

Это переходная точкаУ меня есть код:

app.js

angular.module('app')
  .run(function ($state, $transitions, AuthService) {
    $transitions.onBefore({ to: 'auth.**' }, function() {
      AuthService.isAuthenticated().then(function (isAuthenticated) {
        if (!isAuthenticated) {
          $state.go('login');
        }
      });
    });
  });

Я использую сервис $state для перенаправления пользователя на страницу входа, когда неаутентифицированный пользователь пытаетсячтобы получить доступ к авторизованному ограниченному представлению.Но в этой реализации переход onBefore() уже разрешен, поэтому переход выполняется успешно до завершения моего метода checkAuth().Таким образом, он по-прежнему показывает представление, на которое он собирается в течение (split) sec, прежде чем он перейдет к представлению входа в систему.

Вот реализация методов службы аутентификации, использованных в приведенном выше коде:

auth.service.js

authService.isAuthenticated = function () {
  // Checks if there is an authenticated user in the app state.
  var authUser = AuthUserStore.get();
  if (authUser) {
    return Promise.resolve(true);
  }
  // Do check auth API request when there's no auth user in the app state.
  return authService.checkAuth()
    .then(function () {
        return !!AuthUserStore.get();
      });
};

authService.checkAuth = function () {
  return $http.get(API.URL + 'check-auth')
    .then(function (res) {
        // Store the user session data from the API.
        AuthUserStore.set(res.data);
        return res;
      });
};

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Спасибо Джонатану Дсоузе за предоставление документации HookResult от UI Router.

Эта проблема решается путем обработки Promise из метода сервиса isAuthenticated() и возврата необходимого значения HookResult для обработки переходапо мере необходимости:

app.js

angular.module('app')
  .run(function ($transitions, AuthService) {
    $transitions.onBefore({to: 'auth.**'}, function (trans) {
      return AuthService.isAuthenticated().then(function (isAuthenticated) {
          if (!isAuthenticated) {
            return trans.router.stateService.target('login');
          }
          return true;
        });
    });
 });
0 голосов
/ 29 мая 2018

Согласно моему пониманию ловушки onBefore,

Возвращаемое значение можно использовать для приостановки, отмены или перенаправления текущего перехода.

https://ui -router.github.io / ng1 / docs / latest / classes / transition.transitionservice.html # onbefore

Возможно, вам нужно заглянуть в HookResult и использовать его в соответствии с вашими потребностями.

https://ui -router.github.io / ng1 / docs / latest / modules / transition.html # hookresult

Надеюсь, это поможет

Ура!

...