Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Hag lo que hicimos: generación de tokens

Primero, agregar la biblioteca Auth0 java-jwt , incluida esta dependencia en su pom.xml:

com.auth0
java-jwt
4.5.0

A continuación, será necesario crear la clase encargada de generar los tokens:
@Service
public class TokenService {
@Value("${api.security.token.secret}")
private String secret;
public String generarToken(Usuario usuario) {
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.create()
.withIssuer("API Voll.med")
.withSubject(usuario.getLogin())
.withExpiresAt(fechaExpiracion())
.sign(algoritmo);
} catch (JWTCreationException exception){
throw new RuntimeException("error al generar el token jwt", exception);
}
}
private Instant fechaExpiracion() {
return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-03:00"));
}
}

También deberá agregar la siguiente propiedad al archivo application.properties:
api.security.token.secret=${JWT_SECRET:12345678}

Finalmente, será necesario crear el DTO DatosTokenJWT y modificar la clase AutenticacionController:
public record DatosTokenJWT(String token) {}

@RestController
@RequestMapping("/login")
public class AutenticacionController {
@Autowired
private TokenService tokenService;
@Autowired
private AuthenticationManager manager;

@PostMapping
public ResponseEntity iniciarSesion(@RequestBody @Valid DatosAutenticacion datos) {
    var authenticationToken = new UsernamePasswordAuthenticationToken(datos.login(), datos.contrasena());
    var autenticacion = manager.authenticate(authenticationToken);
    var tokenJWT = tokenService.generarToken((Usuario) autenticacion.getPrincipal());
    return ResponseEntity.ok(new DatosTokenJWT(tokenJWT));
}

}

1 respuesta

Hola Yolima,

Parece que estás en el camino correcto para implementar la generación de tokens JWT en tu aplicación Spring Boot. Has agregado la dependencia correcta y creado la clase TokenService para generar los tokens. Además, has configurado la propiedad del secreto en application.properties, lo cual es crucial para asegurar tus tokens.

Una cosa que podrías verificar es si el valor del secreto (api.security.token.secret) está siendo correctamente leído desde tu archivo application.properties. Asegúrate de que el archivo esté en el lugar correcto y que el valor del secreto sea el que esperas.

Además, en tu método fechaExpiracion(), estás estableciendo la expiración del token a 2 horas desde el momento de la creación. Esto es una buena práctica para asegurar que los tokens no sean válidos indefinidamente.

Por último, en tu AutenticacionController, estás utilizando el AuthenticationManager para autenticar al usuario antes de generar el token. Esto es importante para asegurarte de que solo los usuarios autenticados reciban un token.

Si todo está configurado correctamente, deberías poder generar un token JWT cuando un usuario inicie sesión. Si encuentras algún error o problema, verifica los logs de la aplicación para obtener más detalles sobre lo que podría estar fallando.

Espero haber ayudado y buenos estudios!