Как автоматически выйти из системы по истечении срока действия маркера jwt? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу, чтобы приложение автоматически выходило из системы по истечении срока действия.

Код углового клиента:

login(credentials) {
    return this.http.post('http://something/api/login/',
      credentials)
      .map(response => {
        let result = response.json();
        if (result && result.token) {
          localStorage.setItem('token', result.token);
          return true;
        }
        return false;
      });
  }

Поскольку токен содержит:

  "exp": 1526016179 // expiry time

Возможно, я мог бы сделать это в app.component, который имеет <router-outlet></router-outlet>:

ngOnInit() {
    let token = localStorage.getItem('token');
   timer:DateTime = new Date(_JwtHelper.decodeToken(token).exp);
    if (timer && (Date.now() > timer)) {
      logout();       
    }
  }

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

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

Ответы [ 2 ]

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

Для этого пользователь должен выполнить действие в пользовательском интерфейсе. Я сделал это следующим образом. Но это происходит только тогда, когда пользователь делает сервисный вызов. Все сервисные вызовы моего системного вызова с помощью этого метода.

public makeHttpCall(url, options): Observable<any> {

    if (options.auth) {
      if (!options.headers) {
        const token = this.CurrentUser.token
        const headers = new Headers();
        headers.append('Access-Control-Allow-Origin', '*');
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', 'bearer ' + token);
        headers.append('UserName', this.CurrentUser.username);
        options.headers = headers;
      }
    }

    return this.http.request(url, options).map(this.extractData).catch(this.handleError.bind(this)).pipe(
      tap( 
        data => {}
        ,
        error => {}
      )
    );

}


private extractData(res: Response) {
    const body = res.json();
    return body || {};
}

private handleError(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body.error || JSON.stringify(body);
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
      if (error.status === 401 || error.status === 403) {
        // Here we can handle logout function of the system
        this.router.navigate(['logout']);

      }
    } else {
      errMsg = error.message ? error.message : error.toString();
    }
    return Observable.throw(errMsg);
 }

Надеюсь, это кому-нибудь поможет.

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

Используйте таймер (setInterval) для обратного отсчета до следующего вызова API.Если текущее время больше времени истечения сеанса, выйдите из системы.Если на сервер поступает какой-либо новый вызов, сбросьте таймер.

Это может быть обработано как отдельная служба, которую можно вызывать в службе httpInterceptor.

...