5
respostas

Aplicação gerando token apenas uma vez.

Minha aplicação só cria o token na primeira autenticação, e consigo acessar as demais rotas normalmente. Acontece que após a expiração do token, eu tento fazer "login" novamente, mas só recebo o status code 400 de bad request. E só consigo gerar outro token após derrubar a aplicação e rodar novamente. Alguém pode me ajudar a resolver esse problema?

5 respostas

Oi Elailson,

Estranho, deveria gerar novos tokens normalmente.

Consegue disponibilizar o código do seu projeto pra gente dar uma olhadinha no que pode ser?

Oi Rodrigo, Qual parte do código? O código está semelhante ao do curso, tanto que assisti duas vezes para verificar se não esqueci de nada. O código apenas está configurado para outro banco de dados (Postgres) e a aplicação está hospedada no Heroku. Obs: Coloquei para mostrar os dados retornados do banco, e em todas as tentativas de autenticação são retornados os dados do usuário corretamente, porém acaba caindo no "catch". Coloquei para printar a mensagem e o stacktrace da exceção, as mensagens são as seguintes:

EXCEÇÃO: Bad credentials. STACKTRACE: org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:151)

CÓDIGO QUE FAZ A BUSCA NO BANCO

@Override
    public Usuario buscaPorEmail(String email) {
        try {
            PreparedStatement stmt = connection.prepareStatement("SELECT ID, NOME, SENHA FROM USUARIO WHERE EMAIL = ?");
            stmt.setString(1, email);
            Usuario usuario = new Usuario();
            ResultSet rs = stmt.executeQuery();
            rs.next();
        usuario.setId(rs.getString(1));
            usuario.setNome(rs.getString(2));
            usuario.setSenha(rs.getString(3));
            rs.close();
            return usuario;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            return null;
        } finally {
            fechar();
        }
    }

CLASSE AUTENTICAÇÃO CONTROLLER

@RestController
@RequestMapping("/auth")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager authManager;

    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity<TokenDTO> autenticar(@RequestBody LoginForm form) {
        UsernamePasswordAuthenticationToken dadosLogin = form.converter();
        try {
            Authentication authentication = authManager.authenticate(dadosLogin);
            String token = tokenService.gerarToken(authentication);
            return ResponseEntity.ok(new TokenDTO(token, "Bearer"));
        } catch (AuthenticationException e) {
            System.out.println("EXCEÇÃO: " + e.getMessage() + "STACKTRACE: " + e.getStackTrace()[0]);
            return ResponseEntity.badRequest().build();
        }
    }

}

CÓDIGO QUE GERA O TOKEN

public String gerarToken(Authentication authentication) {
        Usuario logado = (Usuario) authentication.getPrincipal();
        Date hoje = new Date();
        Date dataExpiracao = new Date(hoje.getTime() + 300000);

        return Jwts.builder()
                .setIssuer("API")
                .setSubject(logado.getId().toString())
                .setIssuedAt(hoje)
                .setExpiration(dataExpiracao)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }

MÉTODO CONFIGURE

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(HttpMethod.POST, "/auth").permitAll()
                .antMatchers(HttpMethod.POST, "/usuario/cadastra").permitAll()
                .anyRequest().authenticated()
                .and().csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, usuarioRepository), UsernamePasswordAuthenticationFilter.class);
    }

Oi Elailson,

A principio não vi nada de errado no código.

Chutaria então que pode ser algo no Heroku. Você chegou a testar se localmente também acontece o problema?

Sim, localmente acontecia o mesmo problema. Consegui resolver professor, o problema estava na interface UsuarioRepository, a qual eu implementava na classe DAO. Após remover essa anotação da classe e fazer a chamada direta ( Usuario usuario = new UsuarioDAO().buscaPorEmail(email) ), funciocou perfeitamente. Queria poder deixar a interface para deixar o código mais "encapsulado", mas parece que não vai rolar.