10
respuestas

[Duda] Validando el Token

public String getSubject(String token) {
        DecodedJWT verifier = null;
        try {
            Algorithm algorithm = Algorithm.HMAC256(apiSecret);
            verifier = JWT.require(algorithm)
                .withIssuer("voll med")
                .build()
                .verify(token);
            verifier.getSubject();    
        } catch (JWTVerificationException exception){
            // Invalid signature/claims
        }
        if(verifier.getSubject() == null) {
            throw new RuntimeException("Verifier inválido");
        }
        return verifier.getSubject();
    }

Me sale esta Exception:

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

Leí en una discusión anterior esta solución: "... 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();

Pero a mi no me funciona y me sigue indicando la misma Exception. Alguna ayuda por favor.

10 respuestas

Buenas tardes,

Estoy igual que tu.

Tuve el mismo problema. Genere un nuevo token via POST Login en Insonmia y remplaze al viejo token que estaba en los metodos GET y funciono. Espero que te sirva.

Saludos

Hola Matías, también había intentado esa parte pero tampoco me funciona. Sigo buscando para ver que encuentro.

Verifiquen si en el Bearer no tenga comillas dobles el token, usen el codigo del instructor.

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 == null || verifier.getSubject() == null) {
            throw new RuntimeException("Verifier invalido");
        }
        return verifier.getSubject();

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

Intenté todas sus sugerencias pero nunca me funcionó; olvidé comentarles que estaba usando Eclipse y a lo largo del curso hubo pequeñas diferencias con los videos pero que al final se solucionaban, sin embargo en este punto lo que hice fue continuar con el curso y más adelante se van tratando los problemas que me aparecieron ahora y se va corrigiendo todo.

Me pasaba lo mismo y seguí con el curso para saber si el profesor lo solucionaba mas adelante.

Esto no sucedió pero en el foro de los videos de adelante encontré este error en mi código que era tan peque como un espacio.

Les dejo la imagen de lo que me soluciono a mi.

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

La forma en que lo solcuione fue desactivando el SecurityFilter quitandole el @Component y en Insomnia ejecutar una vex más el post para que me diera un nuevo Token, este mismo lo remplazan en sus gets y vuelven habilitar su Filter

Gracias Sebastian Daza Pérez, tu solución me funciono perfecto.

Sebastian Daza Pérez tu respuesta fue la que me ayudó, muchas gracias.

Creo que lo que podría fallar (aunque no estoy muy seguro de ello ya que no lo he comprobado) es que cuando creamos los tokens, siguiendo la clase, se creó un método para expirarlos y se puso de tiempo 2 hrs, si nosotros tratamos e usar el mismo token después del tiempo de expiración ya no debería funcionar, y por eso la solución al problema es generar otro token como explicaba nuestro compañero. Habría que quitar el método de expiración para ver si se resuelve el problema si es que vuelve a pasar, aunque, como dije, es solo mi teoría, pues no lo he comprobado; pero de momento el generar otro token parece la solución ideal.

Los heroes si existen Sebastian Daza Pérez