Boa tarde pessoal! Estou desenvolvendo um sistema utilizando tokens e a cada 15 minutos o mesmo expira e minha API tem uma funcionalidade para atualizar o token e continuar com o acesso.
Consegui: 1). Criar o interceptor no qual se retornar um código 401 (significa que não possui token ou o token está com tempo de atualização espirado). 2). Se meu back-end retornar um 419 eu realizo o refresh token 3). Após refresh-token consigo atualizar meu token no local Storage. 4). O problema esta em chamar novamente a requisição inicial.
Segue código do interceptor:
@Injectable()
export class AgroInterceptor implements HttpInterceptor {
private requestClone: HttpRequest<any>
private nextClone: HttpHandler;
constructor(private authService: UserTokenCanaService,
private route: Router,
private injector: Injector) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (request.url.search(login) === -1 && request.url.search(loginRefresh)) {
request = this.addHeaderToken(request);
}
this.requestClone = request.clone();
this.nextClone = next;
return this.sendRequest(request, next);
};
/**
* Function responsável em adicionar os Headers obrigatórios da requisição;
* @param request
*/
private addHeaderToken(request: HttpRequest<any>): HttpRequest<any> {
if (this.authService.hasUser()) {
request = request.clone({
setHeaders: {
Authorization: this.authService.getToken(),
"Accept-Language": this.authService.getUser().locale
}
});
} else {
request = request.clone({
setHeaders: {
Authorization: this.authService.getToken()
}
});
}
return request;
}
/**
* Função responsável em enviar a requisição para ser executada.
* @param request
* @param next
*/
private sendRequest(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request.clone()).catch(x => this.handleAuthError(x, request, next));
}
private handleAuthError(err: HttpErrorResponse, request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (err.status === 401) {
this.authService.logout();
this.route.navigateByUrl('/login');
return Observable.of(new HttpResponse({ status: 401 }));
} else if (err.status === 419) {
//REALIZA REFRESH TOKEN.
return this.refreshToken(this.requestClone, next);
}
return Observable.throw(err);
};
//GERAÇÃO DE REFRESH TOKEN
refreshToken(request: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>> {
//INJEÇÃO DE DEPENDÊNCIA EM TEMPO DE EXECUÇÃO PARA NÃO OCASIONAR ERRO DE DEPENDÊNCIA CÍCLICA.
const service = <AuthorizationService>this.injector.get(AuthorizationService);
return Observable.create((observer: Observer<any>) => {
service.refreshToken().toPromise()
.then((data) => {
this.authService.setToken(data.headers.get('Authorization'));
this.authService.setRefreshToken(data.headers.get('RefreshToken'));
request = this.addHeaderToken(request.clone());
return this.sendRequest(request, next);
});
});
}
Alguém poderia ajudar?