Где в Angular время жизни запроса для обновления токена JWT - PullRequest
1 голос
/ 18 июня 2019

Я все еще новичок в Angular.Я хочу обновить токен доступа, но не знаю, где это сделать.

Я знаю о guards and interceptors.Где лучшее место для этого?Есть ли компромиссы, которые я должен принять во внимание?

Многие вопросы здесь показывают, как это сделать в любом случае, но не обсуждают «почему».Я думаю, что обновление должно происходить в защите в самом начале цикла запроса, поэтому маршрутизатор знает, нужно ли «активировать».Но большинство примеров показывают это в перехватчике (либо просматривая время истечения, либо ожидая 401 и затем обновляя).

Любой совет будет оценен.


ОБНОВЛЕНИЕ
Я знаю «как», что мне нужно понять, так это почему.Где правильное место для обновления?

Задача охранника состоит в том, чтобы просто проверить, вошел ли пользователь в систему, и, если нет, перенаправить на страницу входа.

Если токен обновления имеетИстек срок действия, тогда я считаю, что охранник должен вернуть false для canActivate(ActivatedRouteSnapshot, RouterStateSnapshot), поскольку пользователь, хотя и прошел проверку подлинности, больше не имеет текущего разрешения.

Именно поэтому я склоняюсь к тому, чтобы поместить его в охрану.Но большинство примеров, включая превосходный ниже, показывают обновление в перехватчике.Конечно, тогда уже очень поздно в цикле запросов?Чего мне здесь не хватает - это только вопрос стиля или в цикле угловых запросов есть что-то большее, что я должен учитывать?

1 Ответ

2 голосов
/ 18 июня 2019

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

Если токен истек, покажите предупреждение toastr и предотвратите дальнейшие вызовы API.

Для получения дополнительной информации об использовании перехватчика, посетите этот 10 способов использования перехватчиков и Angular 7 JWT Interceptor

Полный код:

HTTP-interceptor.service.ts

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { SessionService } from './session.service';
import { Router } from '@angular/router';
import { throwError } from 'rxjs';

declare var toastr;

@Injectable({
  providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {

  constructor(private router: Router, private sessionService: SessionService) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    var token = this.sessionService.getToken();
    if (token != null && this.sessionService.isTokenExpired()) {
      this.sessionService.logOut()
      toastr.warning("Session Timed Out! Please Login");
      this.router.navigate(['/login'])
      return throwError("Session Timed Out")
    } else {

      const authRquest = req.clone({
        setHeaders: {
          Authorization: 'Bearer ' + token
        }
      })
      return next.handle(authRquest)
        .pipe(
          tap(event => {
          }, error => {
          })
        )
    }

  }
}

app.module.ts

 providers: [
    {
        provide: HTTP_INTERCEPTORS,
        useClass: HttpInterceptorService,
        multi: true
      }
   ]

SESSION-service.ts

  getToken(): string {
    return localStorage.getItem('userToken');
  }

  getTokenExpirationDate(token: string): Date {
    token = this.getToken()
    const decoded = jwt_decode(token);

    if (decoded.exp === undefined) return null;

    const date = new Date(0);
    date.setUTCSeconds(decoded.exp);
    return date;
  }

  isTokenExpired(token?: string): boolean {
    if (!token) token = this.getToken();
    if (!token) return true;

    const date = this.getTokenExpirationDate(token);
    if (date === undefined) return false;
    return !(date.valueOf() > new Date().valueOf());
  }

  logOut(loginType?: string) {
    localStorage.removeItem('isLoggedin');
    localStorage.removeItem('userRole');

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...