Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Quando disparo a requisição no insomnia está dando erro ao disparar requisição no insomnia. RESOLVI POR AQUI ! Se alguém precisar as classes com as correções para a versão 3.5.3 estão na resposta do tópico.

Deu erro no último comando da aula

Como pegar um novo token quando esse expirar?

@Service
public class TokenService {

    @Value("${api.security.token.secret}")
    private String secret;

    private static final Logger log = LoggerFactory.getLogger(TokenService.class);



    public String gerarToken(Usuario usuario){

        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer("API Voll.med")
                    .withSubject(usuario.getLogin())
                    //.withClaim("id", usuario.getId())
                    .withExpiresAt(dataExpiracao())
                    .sign(algoritmo);
        } catch (JWTCreationException exception){
            throw new RuntimeException("Erro ao gerar token jwt", exception);
        }

    }

    public String getSubject(String tokenJWT){
        try {

            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.require(algoritmo)
                    .withIssuer("API Voll.med")
                    .build()
                    .verify(tokenJWT)
                    .getSubject();
        } catch (JWTVerificationException exception){
            exception.printStackTrace();
            throw new RuntimeException("Token JWT inválido ou expirado", exception);
        }
    }



    private Instant dataExpiracao() {
        return LocalDateTime.now().plusHours(5).toInstant(ZoneOffset.of("-03:00"));//criar a data de expiração conforme o horário do Brasil

    }

}

@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        var tokenJWT = recuperarToken(request);
        System.out.println(tokenJWT);
        var subject = tokenService.getSubject(tokenJWT);

        filterChain.doFilter(request, response);
    }

    private String recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if(authorizationHeader == null){
            throw new RuntimeException("Token JWT não enviado no cabeçalho Authorization!");
        }
        return authorizationHeader.replace("Bearer", "");
    }
}

O código compila direitinho mas quando manda a requisição no insomnia dá erro 403 .

Print da compilação do código

Eu modifiquei essa linha do código para não deixar espaço mas agora está dando outro erro. não considerar as duas últimas imagens.

if(authorizationHeader!= null){
            return authorizationHeader.replace("Bearer ", "").trim(); // linha modificada

Insira aqui a descrição dessa imagem para ajudar na acessibilidadePrint do erro no insomnia

Eu até aumentei o tempo de expiação do token mas não deu certo

Está dando erro na linha 26 do SecurityFilter

Está dando erro na linha 52 do TokenService

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Classes sem os imports para a versão 3.5.3 com JDK 21

@Service
public class TokenService {

    @Value("${api.security.token.secret}")
    private String secret;

    private static final Logger log = LoggerFactory.getLogger(TokenService.class);
    private static final String ISSUER = "API Voll.med";



    public String gerarToken(Usuario usuario){

        try {
            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withIssuer(ISSUER)
                    .withSubject(usuario.getLogin())
                    //.withClaim("id", usuario.getId())
                    .withExpiresAt(dataExpiracao())
                    .sign(algoritmo);
        } catch (JWTCreationException exception){
            throw new RuntimeException("Erro ao gerar token jwt", exception);
        }

    }

    public String getSubject(String tokenJWT){
        try {

            var algoritmo = Algorithm.HMAC256(secret);
            return JWT.require(algoritmo)
                    .withIssuer(ISSUER)
                    .build()
                    .verify(tokenJWT)
                    .getSubject();
        } catch (JWTVerificationException exception){
            //exception.printStackTrace();
            throw new RuntimeException("Token JWT inválido ou expirado" + tokenJWT, exception);
        }
    }



    private Instant dataExpiracao() {
        return LocalDateTime.now().plusHours(48).toInstant(ZoneOffset.of("-03:00"));//criar a data de expiração conforme o horário do Brasil

    }

}

@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository repository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        if (request.getRequestURI().equals("/login")) {
            filterChain.doFilter(request, response);
            return;
        }

        var tokenJWT = recuperarToken(request);
        if(tokenJWT != null){
            var subject = tokenService.getSubject(tokenJWT);
            var usuario = repository.findByLogin(subject);
            var authentication = new UsernamePasswordAuthenticationToken(usuario,null, usuario.getAuthorities());
            SecurityContextHolder.getContext().setAuthentication(authentication);

        }


        filterChain.doFilter(request, response);
    }
    private String recuperarToken(HttpServletRequest request) {
        var authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            return authHeader.substring(7);
        }
        return null;
    }


}

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {
    @Autowired
    private SecurityFilter securityFilter;
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http, SecurityFilter securityFilter) throws Exception {
        return http
                .csrf(csrf -> csrf.disable())
                .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers(new AntPathRequestMatcher("/login", "POST")).permitAll()
                        .anyRequest().authenticated()
                )
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }



    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception{
         return configuration.getAuthenticationManager();
    }
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
@RestController
@RequestMapping("/login")

public class AutenticacaoController {

    @Autowired
    private AuthenticationManager manager;


    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados ){
        var autenticationtoken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
        var authentication = manager.authenticate(autenticationtoken);
        var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal());

        return ResponseEntity.ok(new DadosTokenJWT(tokenJWT));
    }
}

Print da resposta no insominia

Print da resposta no Insomnia

solução!

Bom dia, Terezinha! Tudo bem?

Pelo que li no título do tópico, você resolveu o problema e ainda compartilhou a solução que você encontrou! Meus parabéns, tenho certeza que ajudará outros alunos que enfrentarem o mesmo problema.

Continue assim e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!