Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

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

}