Я использую завершение аутентификации JWT, когда срок действия токена истек (сервер проверяет его). Мне нужно вызвать API обновления токена и повторно выполнить последний вызов, который не удался, поскольку токен с истекшим сроком действия.
У меня уже есть Interceptor, но я должен обновить заголовок аутентификации, прежде чем сделать запрос, и мне нужно ждать вызова refreshToken
.
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { shouldRetry } = this;
return next.handle(request).pipe(
retryWhen(genericRetryStrategy({
shouldRetry
})),
catchError(err => {
//401 the token is invalid so I have to refresh it
if (err.status === 401) {
this.auth.refreshToken().subscribe(
(apiResult: SessionTokenResponse) => {
this.auth.saveToken(apiResult.token);
},
error => this.auth.logout()
);
request = request.clone({headers: request.headers.set('Authorization', 'Bearer ' + this.auth.getSessionToken)});
return next.handle(request);
}
const error = err.error.message || err.statusText;
return throwError(error);
}),
)
}
Это правильный способ переделать вызов? Как я могу дождаться конца refreshToken
? Спасибо
РЕДАКТИРОВАТЬ: я обновил с этим кодом, который, кажется, работает, я тестирую его
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { shouldRetry } = this;
return next.handle(request).pipe(
retryWhen(genericRetryStrategy({
shouldRetry
})),
catchError(err => {
//401 the token is invalid so I have to refresh it
if (err.status === 401) {
this.auth.refreshToken().subscribe(
(apiResult: SessionTokenResponse) => {
this.auth.saveToken(apiResult.token);
request = request.clone({ headers: request.headers.set('Authorization', 'Bearer ' + apiResult.token) });
next.handle(request).subscribe();
},
err => this.auth.logout()
);
}else{
const error = err.error.message || err.statusText;
return throwError(error);
}
}),
)
}