O doFilterInternal recebe o token, mas quando adiciono
var subject = tokenService.getSubject(tokenJWT);
Ele não valida mais nenhum e o Insomnia dá sempre o mesmo erro: { "timestamp": "2023-02-09T20:04:08.349+00:00", "status": 500, "error": "Internal Server Error", "message": "The input is not a valid base 64 encoded string.", "path": "/medicos" }
SecurutyFilter:
@Component //Não se encaixa em outras classes específicas, é um componenete. public class SecurityFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
//Este método é o filtro, ele acessa o método de recuperar cabeçalho e depois o de validar.
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
var tokenJWT = recuperarToken(request);
var subject = tokenService.getSubject(tokenJWT);
System.out.println(subject);
filterChain.doFilter(request, response); //segue para chamar o próximo filtro, se não existir, interrompe a execução.
}
private String recuperarToken(HttpServletRequest request) { //Este método recupera o token do cabeçalho
var aurthorizationHeader = request.getHeader("Authorization");
if (aurthorizationHeader == null) {
throw new RuntimeException("Token JWT não enviado no cabeçalho Authorization!");
}
return aurthorizationHeader.replace("Bearer", "");
}
}
TokenService:
@Service public class TokenService {
@Value("${api.security.token.secret}")//assim o valor de secret vai ser lido na classe propreties, a senha depois dos : no properties é para se ele não encontrar a senha ambiente. Ela só existe em produção.
private String secret;
public String gerarToken (Usuario usuario){ //o método veio do https://github.com/auth0/java-jwt, na parte de create jwt, então ele foi adaptado para o projeto.
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.create()
.withIssuer("API Voll.med")
.withSubject(usuario.getLogin())
.withClaim("id", usuario.getId())
.withExpiresAt(dataErpiracao())
.sign(algoritmo);
} catch (JWTCreationException exception){
throw new RuntimeException("erro ao gerar token jwt", exception);
}
}
public String getSubject (String tokenJWT){ //Este método valida ou não o token do cabeçalho //o método veio do https://github.com/auth0/java-jwt, na parte de verify jwt, então ele foi adaptado para o projeto.
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.require(algoritmo)
.withIssuer("API Voll.med")
.build()
.verify(tokenJWT)
.getSubject();
} catch (JWTCreationException exception){
throw new RuntimeException("Token JWT inválido ou expriado");
}
}
private Instant dataErpiracao() {
return LocalDateTime.now().plusYears(2).toInstant(ZoneOffset.UTC);
}
}