繁体   English   中英

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

[英]handle jwt token expiration and get the new token returned by backend

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

这是我的拦截器 angular:

@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']);
        }
      }
    });


  }
}

并且在服务中有我的登录 function :

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

当用户在应用程序上处于活动状态时,后端服务器返回一个新令牌,我想每次在响应 header 中返回的令牌与我发送的令牌进行比较,如果它们相等,我什么也不做,但如果它们不同我想用新的替换本地存储中的令牌。请帮助。

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

任何人都可以帮助我们吗? 我真的有什么建议吗??

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM