Solucionado (ver solución)
Solucionado
(ver solución)
8
respuestas

[Duda] Validando el Token

    DecodedJWT verifier = null;
    try {
        Algorithm algorithm = Algorithm.HMAC256(apiSecret); // validando firma
        verifier = JWT.require(algorithm)
                .withIssuer("voll med")
                .build()
                .verify(token);
        verifier.getSubject();
    } catch (JWTVerificationException exception) {
        System.out.println(exception.toString());
    }
    if (verifier.getSubject() == null) {
        throw new RuntimeException("Verifier invalido");
    }
    return verifier.getSubject();
}

Me lanza un error del tipo:

java.lang.NullPointerException: Cannot invoke "com.auth0.jwt.interfaces.DecodedJWT.getSubject()" because "verifier" is null

Alguna sugerencia?

8 respuestas
solución!

¡Hola Fidel! Parece que el error se debe a que la variable "verifier" es nula y, por lo tanto, no se puede invocar el método "getSubject()". Una posible solución sería mover la línea "verifier.getSubject();" dentro del bloque "try", después de la verificación del token. De esta manera, si la verificación es exitosa, la variable "verifier" tendrá un valor y se podrá invocar el método "getSubject()". Quedaría así:

DecodedJWT verifier = null;
try {
    Algorithm algorithm = Algorithm.HMAC256(apiSecret); // validando firma
    verifier = JWT.require(algorithm)
            .withIssuer("voll med")
            .build()
            .verify(token);
} catch (JWTVerificationException exception) {
    System.out.println(exception.toString());
}
if (verifier == null || verifier.getSubject() == null) {
    throw new RuntimeException("Verifier invalido");
}
return verifier.getSubject();

Espero que esto te ayude a solucionar el problema. ¡Buenos estudios!

Muchas gracias

Buenas tardes,

A mi me presenta el mismo problema e hice la respectiva corrección planteado por Eric pero me sigue saliendo la excepción.

¡Hola Cristian!

Parece que el problema persiste a pesar de haber realizado la corrección sugerida. En ese caso, es posible que haya otra fuente de error en tu código. Algunas cosas que podrías verificar son:

  1. Asegúrate de que la variable token esté recibiendo el valor correcto y que no sea nula.
  2. Verifica que el valor de apiSecret también sea válido y no esté vacío.
  3. Comprueba que estás utilizando la biblioteca adecuada para el manejo de JWT (JSON Web Tokens) y que está correctamente importada en tu proyecto.

Si después de verificar estos aspectos aún experimentas problemas, sería útil proporcionar más detalles sobre el contexto de tu código y el stack trace completo de la excepción que estás recibiendo. Esto facilitaría la identificación del problema y brindaría una solución más precisa.

Espero que esto te ayude a resolver la situación. ¡Buena suerte con tu desarrollo!

Yo tuve el mismo error y consultando y leyendo era por el metodo recuperar token me daba un token invalido y con este cambio ya me funcionó todo normal:

private String recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null) {
            int startIndex = "Bearer ".length();
            if (authorizationHeader.length() > startIndex) {
                return authorizationHeader.substring(startIndex);
            }
        }

        return null;
    }

Estoy con el mismo problema y aún no encuentro solución

Hola, Ivan, puedes explicarme el problema que te ocurrió en más detalle?

Hola Ivan, yo pasé por el mismo problema, a pesar de hacer las mismas modificaciones de arriba me seguía apareciendo ese error y revisando un poco me di cuenta que mi token había expirado: al tratar de generar uno nuevo me daba error de que el token era nulo. Para poder generar un nuevo token, en la clase TokenService tuve que borrar el método de getSubject. Haciendo esto pude generar un nuevo token en Insomnia (El que aparece en formato Json). Despues volví a colocar el método getSubject y me funciono perfecto.

Recuerda que para generar un nuevo token se usa Insomnia en la parte de Login de usuario (imagen).

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

Sin embargo espero que un profesor o alguien que sepa me pusiera explicar porque no se puede generar un token si tengo el método getSubject y cuando lo quito si se puede generar un nuevo token. Espero que me puedan ayudar.

Saludos