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));
}
}