Я тестирую свою функцию обновления HTTP-маркера HTTP Angular 6 Interceptor по определенному маршруту, как показано ниже.
Работает (запрос повторно отправляется с новым токеном и возвращаются данные), но отображаетсякоторый сделал запрос не обновляется (это когда не используется Перехватчик).
Добавление функции receiveChanges () в вызывающий компонент в вызове http .then () исправит это, но я не хочу добавлять это (или NgZone.run ()) к каждому http-требованию в моемприложение ..
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url === 'XXX') {
return this.refreshToken().pipe(
switchMap(() => {
req = this.addToken(req);
return next.handle(req);
})
, catchError(() => {
this.authService.signOut();
return throwError('');
})
);
}
...
}
/* Get new google ID token in Auth service and inform when done*/
refreshToken() {
if (this.refreshTokenInProgress) {
return new Observable(observer => {
this.tokenRefreshed$.subscribe(() => {
observer.next();
observer.complete();
});
});
} else {
this.refreshTokenInProgress = true;
return from(this.authService.refreshToken()).pipe(
tap(() => {
this.refreshTokenInProgress = false;
this.tokenRefreshedSource.next();
})
);
}
}
/* Add google id token to request header */
addToken(request) {
const token = this.authService.googleIdToken;
if (token) {
return request.clone({ headers: request.headers.set('google-id-token', token) });
}
return request;
}