1
resposta

Problema Interceptor Angular 4

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?

1 resposta

Oi Patrick, tudo bem? Você teve algum progresso? Estou procurando alguém pra te ajudar aqui, tá bem? Desculpa a demora.