#angular #typescript
#angular #typescript
Вопрос:
Приветствую, я внедряю перехватчик в Angular 9, при захвате, когда idtoken неверен, он генерирует новые токены, но запрос больше не отправляется, код перехватчика такой:
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { AuthService } from 'src/app/services/auth.service';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private auth:AuthService) {}
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
console.log ("solicitud interceptada correctamente!");
let data = JSON.parse(localStorage.getItem('data'));
let refreshToken = data['data'].refreshToken;
console.log('refreshToken',refreshToken);
return next.handle(request).pipe(catchError(err => {
console.log(err.error);
if (err.error.code === 401) {
console.log('Refresh Token');
if (err.error.message == "Token no valido.") {
console.log('Refresh Token');
let refresh={
"refreshToken":refreshToken
}
this.auth.getTokenRefresh(refresh)
.subscribe(respt =>{
// this.datar['data'].refreshToken=respt['data'].refreshToken;
data['data'].idToken=respt['data'].idToken;
data['data'].accessToken=respt['data'].accessToken;
this.auth.guardarToken(respt['data'].idToken);
this.auth.guardarRespuesta(data);
console.log(respt);
console.log("Datos Refrescar",data);
console.log("Id token Refrescar",respt['data'].idToken);
request = request.clone({
setHeaders: {
'Application': 'UEhBTlRPTVhfV0VC',
'Authorization': `Bearer ${respt['data'].idToken}`
}
});
// this.router.navigate(['/seguridad/gestion-usuarios']);
},(err) =>{
// this.error=err.error['message'];
// this.erroru=true;
console.log(err.error);
});
return next.handle(request);
//TODO: Token refreshing
}else {
//Logout from account or do some other stuff
}
}
return next.handle(request);
// return next.handle(request);
}));
}
}
Я понимаю, что «return next.handle (запрос);» Он снова генерирует запрос, но я не знаю, почему это не сделано, я много исследовал, но я не получаю решения, я был бы признателен за помощь
Ответ №1:
Вы должны подождать, пока API токена обновления не вернет ответ. Если вы не знаете, как дождаться ответа http, прежде чем перейти к следующей строке кода, прочитайте либо об «асинхронности и ожидании», либо о «forkJoin».
Комментарии:
1. Как бы я это сделал? У меня нет большого опыта работы с await