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



我从后端服务器获取令牌,并将其存储在本地存储中,并使用拦截器处理每个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)))
}   

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

后端的解决方案是,当用户在应用程序上活动时,每5分钟发送一个令牌给example,而当用户在30分钟后不活动时,令牌过期了,所以我想要的解决方案只是比较每个请求中响应头中的令牌和请求头中的代币,如果它们等于===>什么都不做,否则用新的令牌替换旧的令牌,有什么帮助吗?

最新更新