Angular CanActivate не направляет на новый маршрут, когда refre sh token api вызывается даже при возврате true - PullRequest
0 голосов
/ 03 февраля 2020

Я работал над добавлением охранника маршрута и перехватчика токенов в проекте Angular 6.

В canActivate охранника маршрута я вызываю асинхронный метод c, который проверяет, есть ли токен доступа срок действия истек:

  1. Если да, проверяет срок действия маркера refre sh и, если срок его действия также истек, пользователь выходит из системы, в противном случае получает новый токен доступа с помощью refre sh токен.

  2. Если нет, то пользователь перемещается к маршруту.

Однако, когда срок действия токена истек, (точка 1 ), маршрут не перемещен в. Я перепробовал все и все комбинации, но это все еще не работает.

AuthGuard.service.ts

  async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    const isAuthenticated = await this.auth.isAuthenticated();
    if (isAuthenticated) {
      return true;
    } else {
      return false;
    }
}

Auth.service.ts

  public async isAuthenticated() {
    // Check whether the token is expired and return true or false
    const token = sessionStorage.getItem('token');
    if (token) {
      if (await this.checkTokenValidity(token)) {
        return true;
      } else {
        return false;
      }
    }
    return false;
  }

public checkTokenValidity = async (token) => {
    //checking if access token is valid or not
    const isAccessTokenExpired = this.tokenService.tokenExpiry(token);
    if (isAccessTokenExpired) {
      const response = await this.tokenService.getNewToken();
    }
    const isSignatureValid = this.tokenService.isSignatureValid(sessionStorage.getItem('token'));
    if (!isSignatureValid) {
      return false;
    }
    return true;
}

 getNewToken = async () => {
    const url = 'api/refresh/';
    const refreshToken = Object.assign({}, { refresh: refreshToken });
    sessionStorage.removeItem(TOKEN);
    // if refresh token has expired then log the user out.
    if (this.tokenExpiry(refreshToken)) {
      sessionStorage.clear();
      this.router.navigate([''])
      return;
    }
    return this.apiService.postData(url, refreshToken).toPromise();
  }

1 Ответ

0 голосов
/ 03 февраля 2020

Вставьте Router экземпляр в ваш конструктор, и когда ваше условие (истечение срока действия токена) не будет выполнено, направьте пользователя к вашему компоненту выхода из системы .

constructor(private router: Router) { }

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    const isAuthenticated = await this.auth.isAuthenticated();
    if (isAuthenticated) {
      return true;
    } else {
      this.router.navigate(['/logout']);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...