Как я могу проверить правильность аутентификации и перенаправить после? - PullRequest
0 голосов
/ 30 октября 2019

Как видно из названия. Я проверяю аутентификацию, используя запрос к API. Если запросы возвращают false, я хочу выйти из системы. Однако, если я делаю это с охраной, она не работает, потому что она работает синхронно, и я не могу дождаться запроса на показ страницы при каждом переходе на другую страницу.

Пример:

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    this.authService.checkAuth(); // Sends request to backend for auth validation
    return this.authService.getIsAuthenticated(); // Shows/doesn't show page before validation
  }

Если я запустлю его асинхронно, он будет каждый раз ждать ответа, прежде чем отобразит страницу. Я хочу, чтобы он отображал страницу во время запроса, но если запрос возвращает false, я хочу выйти из системы ie this.authService.logout().

Могу ли я достичь этого, не помещая его в IonicViewDidLoad каждой страницы?

Сценарий:

Пользователь вошел в систему на двух устройствах. Пользователь отменяет связь с одним из устройств. Поэтому во время сеанса необходимо отключить другое устройство.

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

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Я использую токен jwt для дескриптора авторизации. Есть часть кода (перехватчик), где я проверяю, аутентифицирован ли пользователь:

 intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any> | any> {

    return next.handle(this.addTokenToRequest(request, this.authService.getToken()))
      .pipe(
        catchError(err => {
        if (err.status === 0 || err.status === 401) {
            // if server return 401 Unauthorized
            this.authService.logout();
            location.reload(true);
        } else if (err.status === 302) {
          this.router.navigate(['/pages/technical-works']);
        } else {
              return throwError(err.error);
            }
          }));

      private addTokenToRequest(request: HttpRequest<any>, token: string): HttpRequest<any> {
           return request.clone({ setHeaders: { Authorization: `Bearer ${token}` } 
                               });
      }
}

Так что, если сервер вернет несанкционированную ошибку, я выйду из системы на стороне клиента.

0 голосов
/ 31 октября 2019

Проблема с моим решением состояла в том, что моя аутентификация работает с субъектом поведения. По этой причине он не работал так, как я хотел, когда я изменил его в canActivate. Однако мне удалось решить эту проблему (в сочетании с решением перехватчика @Roma Ruzich), проверив, действительна ли авторизация. Если нет, выйдите из системы.

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    this.authService.getAuthStatus().subscribe((data: any) => {
      if (!data.deviceRegistered) {
        this.authService.logout();
      }
    });
    return this.authService.getIsAuthenticated();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...