1
resposta

Angular chamando API recebendo retorno 401

Tenho uma aplicação angular que faz chamadas para uma API que está protegida, então tenho o interceptor abaixo para enviar um token Bearer, mas sempre recebo 401, se eu tiro autenticação na API a aplicação recebe as informações sem problemas, usando o Postman eu consigo chamar a API autenticada sem problemas:

@Injectable()
export class RequestInterceptor implements HttpInterceptor {

    constructor(private tokenService: TokenService) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent
        | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {

            if(this.tokenService.hasToken()) {
                const token = this.tokenService.getToken();
                req = req.clone({
                    setHeaders: {
                        'Authorization': `Bearer ` + token,
                        'Content-Type': 'application/x-www-form-urlencoded'
                    }
                });
            }
            return next.handle(req);
    }
}

Minha API é em .Net Core e eu me certifiquei que ela aceite tudo:

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAll",
                    builder =>
                    {
                        builder
                        .AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader();
                    });
            });

Não sei o que pode ser, adicionei todos os headers que o Postman adiciona e mesmo assim recebo 401.

Edit.: Descobri o que aconteceu, O token estava vencido xD! Alguém sabe a melhor maneira da aplicação ficar renovando o token?

1 resposta

Fala aí Leandro, tudo bem? Fico feliz que tenha resolvido um problema, vamos ao segundo:

Acho que você pode trabalhar com o conceito de refresh token, basicamente quando você logar, você vai receber além do token normal um refresh token. Ele pode ser usado para daqui X tempo você renovar o token principal.

É importante que também seja retornado quando o token vai expirar, um timestamp em milisegundos resolve o problema.

Esse renovação pode ser feita de N maneiras, precisa ver a que faz mais sentido para seu negócio. Uma possível solução é de tempos em tempos você chamar uma função que vai verificar se falta X tempo para o token expirar. Caso falte, você renova ele em background.

Espero ter ajudado.