Boa Noite!!
Após implementar a autenticação do token, não consigo gerar novo token (na requisição de login) (aparece a mensagem: ""message": "Token JWT não enviado no cabeçalho",
e devido o token estar Expirado as demais requisições apresenta a mensagem: "message": "TOKEN JWT INVÁLIDO OU EXPIRADO",
seguem os códigos das classes envolvidas:
CLASSE SecurityFilter:
@Component // é algo genérico
public class SecurityFilter extends OncePerRequestFilter {
//chama a classe tokenService para analizar o token
@Autowired
private TokenService tokenService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//o frontend irá enviar o token pelo cabelho autorization
// APÓS REALIZAR O FILTER, ELE CHAMA: OU O PROXIMO FILTRO OO A CADEIA DE REQUISIÇÃO
var tokenJWT = recuperarToken(request);
var subject = tokenService.getSubject( tokenJWT );
System.out.println( subject ); //imprime o nome do login
System.out.println("chamou o fiter");
System.out.println(tokenJWT); //imprime o token no console
// vai ser encaminhado para o próximo filter o request e o response
filterChain.doFilter( request, response );
}
private String recuperarToken(HttpServletRequest request) {
// vai pegar o cabeçalho da requisição (onde virá o token)
var authorizationHeader = request.getHeader( "Authorization" );
// se não existir o cabeçalho vai lançar uma exception
if (authorizationHeader == null){
throw new RuntimeException("Token JWT não enviado no cabeçalho");
}
// para não vir no nome do cabeçalho(Bearer) foi feito um replace vazio
return authorizationHeader.replace( "Bearer ", " " );
}
}
CLASSE: TokenService:
@Service
public class TokenService {
// aqu ficará a senha para gerar tokens
@Value( "${api.security.token.secret}" ) // aqui indica para buscar a variável no application.properties
private String secret;
public String gerarToken(UsuarioEntidade usuarioEntidade){
System.out.println(secret);
try {
// dentro do parentese vai uma senha para gerar tokens
var algoritimo = Algorithm.HMAC256( secret);
return JWT.create()
.withIssuer("API VOLL.med")
.withSubject( usuarioEntidade.getLogin() )
.withExpiresAt( dataExpiracao() )
.sign(algoritimo);
} catch (JWTCreationException exception){
throw new RuntimeException("erro ao gerar token", exception);
}
}
////++++++++++++++++++++TESTA SE O TOKEN RECEBIDO (SecurityFilter) ESTÁ VÁLIDO+++++++++++
// recebe o token vindo da classe SecutityFilter
public String getSubject(String tokenJWT){
// vai verificar se o token é valido:
try {
var algoritimo = Algorithm.HMAC256( secret);
return JWT.require(algoritimo)
.withIssuer("API VOLL.med")
.build()
.verify(tokenJWT)//verifica se o token está valido
.getSubject(); // pega o nome do login do token
} catch (JWTVerificationException exception){
exception.printStackTrace();
throw new RuntimeException("TOKEN JWT INVÁLIDO OU EXPIRADO");
}
}
// aqui ajusta o tempo de expiração do token ( no caso ficou 2 horas)
private Instant dataExpiracao() {
ZoneOffset zoneOffset = ZoneOffset.of("Z"); // Criando um ZoneOffset UTC
return LocalDateTime.now().plusHours(2).atOffset(zoneOffset).toInstant();
}
}