Я пытаюсь повторить запрос после получения токена обновления.Я трачу 90% вчера, пробуя разные способы, которые сработали для других, но я не нашел ничего, что сработало.У меня 3 перехватчика.первый обрабатывает настройку запроса, второй обрабатывает инъекцию токена, а затем любой действительный ответ, третий обрабатывает любые ошибки.
Я пытался использовать switchMap при вызове refreshToken, но тогда он просто даже не делаетвызов.Таким образом, он выполняет первый вызов, возвращает, что токен истек.Я делаю вызов обновления и устанавливаю новый токен, но он отказывается повторить вызов.Я что-то упустил?
Перехватчик 1:
export class APIInterceptor implements HttpInterceptor {
constructor() { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const clonedReq = req.clone({ url: req.url, responseType: 'json' });
return next.handle(clonedReq);
}
}
Перехватчик 2:
export class JwtInterceptor extends BaseService implements HttpInterceptor {
constructor(private injector: Injector, private notificationService: NotificationService) {
super();
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authService = this.injector.get(AuthenticationService);
const globalService = this.injector.get(GlobalService);
const authReq = req.clone({
headers: req.headers.set('Authorization', this.getAuthToken(req, authService))
.append('Access-Control-Allow-Origin', '*')
});
return next.handle(authReq).map((event: any) => {
globalService.handleLayoutSetup();
if (event instanceof HttpResponse) {
const jsonResponse = <ApiResponse>event.body;
if (jsonResponse.status === 200) {
const body = this.objectToBlob(jsonResponse.data);
const headers = event.headers;
const status = event.status;
const statusText = event.statusText;
const url = event.url;
const response = new HttpResponse({ body, headers, status, statusText, url });
return response;
} else
this.notificationService.htmlNotificationFromErrors(jsonResponse.errors);
} else
return event;
});
}
private getAuthToken(req: HttpRequest<any>, authService: AuthenticationService) {
const currentUser = authService.getCurrentUser();
if (currentUser)
return 'Bearer ' + currentUser.accessToken.token;
else
return '';
}
}
Перехватчик 3:
export class ValidationInterceptor extends BaseService implements HttpInterceptor {
private authService: AuthenticationService;
private authClient: AuthClient;
constructor(private notificationService: NotificationService, private injector: Injector) {
super();
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.authService = this.injector.get(AuthenticationService);
const globalService = this.injector.get(GlobalService);
const signalrService = this.injector.get(SignalRService);
this.authClient = this.injector.get(AuthClient);
return next.handle(req).do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
}
}, (errResponse: any) => {
if (errResponse instanceof HttpErrorResponse) {
if (errResponse.status === 401 && errResponse.headers.has('Token-Expired')) {
return this.authClient.getRefreshToken('0d3452a923d7eb05331ae0e41d0d5e3a')
.subscribe((res: string) => {
this.authService.updateTokenWithRefreshToken(res);
req = this.addAuthHeader(req);
return next.handle(req);
});
} else if (errResponse.status === 0)
this.notificationService.failure('Error', 'Server is offline');
else {
.. handle errors
}
}
});
}
addAuthHeader(request) {
const authHeader = this.authService.getToken();
if (authHeader) {
return request.clone({
setHeaders: {
'Authorization': authHeader
}
});
}
return request;
}
}