处理jwt令牌到期并获取后端返回的新令牌

时间:2019-10-30 17:50:41

标签: angular

我从后端服务器获取令牌,并将其存储在本地存储中,并使用拦截器处理每个HTTP请求中的授权,但是当令牌过期时,我的后端服务器将返回一个新的令牌但是我无法获取它,而用新的令牌替换了本地存储中的旧令牌。

这是我的拦截器角度:

@Injectable()
export class MyInterceptor implements HttpInterceptor {

  constructor(public router: Router) {
  }

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {

    if (request.responseType === 'blob') {
      return next.handle(request)
        .catch((error: any) => {
          if (error instanceof HttpErrorResponse) {
              if (error.error instanceof Blob && error.headers.get('content-type').startsWith('application/json')) {
                  error = new HttpErrorResponse({
                      error: {message: "An error has occured and file cannot be downloaded"},
                      headers: error.headers,
                      status: error.status,
                      statusText: error.statusText,
                      url: error.url
                  });
              }
          }

          return Observable.throw(error);
      });
  }

    let token = localStorage.getItem('Token');

    if (token) {
      request = request.clone({ headers: request.headers.set('Authorization', token) });
      localStorage.setItem('Token', token);
      return next.handle(request);
    }

    return next.handle(request).do((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
        var token = event.headers.get('Authorization');
        if(token) {
          request = request.clone({ headers: request.headers.set('Authorization', token) });
          localStorage.setItem('Token', token);
        }
      }
    }, (err: any) => {
      if (err instanceof HttpErrorResponse) {
        if (err.status === 401) {
          this.router.navigate(['/login']);
        }
      }
    });


  }
}

服务中有我的登录功能:

login() {
    return this.http.get(`${this.auth}security/login`,{withCredentials: true})
        .map((res:any) => {return res})
        .pipe((catchError(this.handleError)))
}   

当用户在应用程序上处于活动状态时,后端服务器返回一个新令牌,并且我希望每次将响应标头中返回的令牌与我发送的令牌进行比较(如果相等),我什么都不做,但是如果它们是不同的,我想用新的令牌替换本地存储中的令牌。请提供任何帮助。

1 个答案:

答案 0 :(得分:0)

后端的解决方案是在用户在应用程序上处于活动状态时每5分钟发送一次示例令牌,而当用户在ffor例如30分钟后未处于活动状态时,令牌已过期,因此我想要的解决方案只是比较每个请求中的响应标头中的令牌和请求标头中的令牌,如果它们等于===>什么都不做,请用新的令牌替换旧的令牌,有什么帮助吗?