2
respostas

Auth

Quando eu for fazer a primeira requisição pro controller Auth, A PRIMEIRA. Vai passar no auth pra gerar o token, pq até então, o token não tinha sido gerado, mas para fazer essa requisição pro /auth primeiro tenho q passar no filtro e vai aparecer que String token = recuperarToken(request) mas essa request é nulla, pq eu ainda não coloquei o token no header p enviar a requisição, pq eu ainda não tenho o token(PORQUE ESTOU NA PRIMEIRA REQUISIÇÃO AIONDA). Era então pro boolean valido = false. Então era pra dar erro e não verificar o token, só q deu certo, não entendi o motivo. Você ainda disse que o filtro vai rodar antes de qualquer coisa.

2 respostas

Oi Vitor,

Toda requisição passa pelo AutenticaoViaTokenFilter, inclusive a primeira requisição(para efetuar a autenticação e que ainda nao tem o header com o token).

O código ficou assim:

String token = recuperarToken(request);
boolean valido = tokenService.isTokenValido(token);
if (valido) {
    autenticarCliente(token);
}

filterChain.doFilter(request, response);

Na primeira requisição vai dar false e não vai entrar no if. Ou seja, o usuário não foi autenticado. Mas repara que a última linha(filterChain.doFilter(request, response)) está fora do if, ou seja, independente de ter logado ou não ela será chamada.

Essa última linha serve para chamar os próximos filtros do Spring, sendo o que próximo filtro vai verificar se libera ou não a requisição. Como a requisição foi feita para o enderço /auth e esse endereço está liberado na classe SecurityConfigurations, o Spring vai executar normalmente a requisição.

A grande questão aqui é que o nosso filtro(AutenticaoViaTokenFilter) não é responsável por barrar/liberar o acesso na API. Quem faz isso é o filtro do Spring que é chamado na sequencia.

O nosso filtro é responsável apenas por autenticar o usuário para o Spring, caso o token esteja vindo no header e seja válido.

Bons estudos!

Aqui tem um diagrama mostrando o fluxo de uma requisição na API, que vai te ajudar a entender melhor:

diagrama mostrando o fluxo de execução de classes que uma requisção chama em nossa API