1
resposta

.withClaim("id", usuario.getId())

Como ficaria o metodo para retornar o login e o ID

    public String pegarSubject(String tokenJWT) {
        try {
            var algoritmo = Algorithm.HMAC256(secreto);
            return JWT.require(algoritmo)
                    .withIssuer("API Voll.med")
                    .build()
                    .verify(tokenJWT)
                    .getSubject();
        } catch (JWTVerificationException exception) {
            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }
    public String pegarSubject(String tokenJWT) {
        try {
            var algoritmo = Algorithm.HMAC256(secreto);
            return JWT.require(algoritmo)
                    .withIssuer("API Voll.med")
                    .build()
                    .verify(tokenJWT)
                    .getClaim()
                    .getSubject();
        } catch (JWTVerificationException exception) {
            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }
1 resposta

Olá Jonnathy!

Para retornar tanto o login quanto o ID do usuário a partir do token JWT, você pode utilizar o método getClaim para obter as informações adicionais que foram armazenadas no token. Vou te mostrar como você pode fazer isso.

Primeiro, vamos ajustar o método pegarSubject para que ele também retorne o ID do usuário. Aqui está um exemplo de como você pode fazer isso:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;

public class TokenService {
    private String secreto = "seuSegredoAqui"; // Substitua pelo seu segredo

    public Usuario pegarDadosUsuario(String tokenJWT) {
        try {
            var algoritmo = Algorithm.HMAC256(secreto);
            var verifier = JWT.require(algoritmo)
                    .withIssuer("API Voll.med")
                    .build();
            var decodedJWT = verifier.verify(tokenJWT);

            String login = decodedJWT.getSubject();
            String id = decodedJWT.getClaim("id").asString();

            return new Usuario(login, id); // Supondo que você tenha uma classe Usuario com login e id
        } catch (JWTVerificationException exception) {
            throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }
}

class Usuario {
    private String login;
    private String id;

    public Usuario(String login, String id) {
        this.login = login;
        this.id = id;
    }

    // Getters e setters, se necessário
}

Neste exemplo, pegarDadosUsuario retorna um objeto Usuario que contém tanto o login quanto o ID. Certifique-se de que o token JWT foi criado com a claim "id" incluída, por exemplo:

String token = JWT.create()
        .withIssuer("API Voll.med")
        .withSubject(usuario.getLogin())
        .withClaim("id", usuario.getId())
        .sign(Algorithm.HMAC256(secreto));

Agora, você pode chamar pegarDadosUsuario no seu filtro de segurança:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    var tokenJWT = recuperarToken(request);

    var usuario = tokenService.pegarDadosUsuario(tokenJWT);
    System.out.println("Login: " + usuario.getLogin() + ", ID: " + usuario.getId());

    filterChain.doFilter(request, response);
}

Espero ter ajudado e bons estudos!