Essa biblioteca gera Token JWT.
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.3.0</version>
</dependency>
JSON Web Token, ou JWT, é um padrão utilizado para a geração de tokens, que nada mais são do que Strings, representando, de maneira segura, informações que serão compartilhadas entre dois sistemas. Você pode conhecer melhor sobre esse padrão em seu site oficial.
Para gerar o token através da biblioteca Auth0, é preciso definir qual algoritmo será utilizado para assinar o token e o seu “segredo”, que é uma chave para o algoritmo. Após isso, é possível adicionar as informações que estarão presentes no token, como Issu
public String gerarToken(Usuario usuario){
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.create()
.withIssuer("API Voll.med")
.withSubject(usuario.getLogin())
.withExpiresAt(dataExpiracao())
.sign(algoritmo);
} catch (JWTCreationException exception){
throw new RuntimeException("erro ao gerar token jwt", exception);
}
}
Uma boa prática é não passar o segredo diretamente no código (Hard code), mas sim
api:
security:
token:
secret: "${JWT_SECRET:12345678}"
Para que o Spring consiga injetar essa configuração em um atributo, é utilizado a anotação @Value.
@Value("${api.security.token.secret}")
private String secret;
Após o Token JWT ser gerado, ele pode ser devolvido na resposta. Porém, para seguir o padrão de utilizar DTOs na comunicação da API, é necessário converter o Token em um DTO.
@PostMapping
public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados){
var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha()); //DTO do Spring para usuario
var authentication = manager.authenticate(authenticationToken); //Classe que chama AutenticacaoService.loadUserByUsername
var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal()); //Token JWT
return ResponseEntity.ok(new TokenDadosTokenJWT(tokenJWT)); //DTO Token
}
public record TokenDadosTokenJWT(String token) {
}
Ao fim deste processo, ao realizar a requisição de autenticação o usuário recebe um Token JWT.
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJicnVuYS5hbHZlc0B2b2xsLm1lZCIsImlzcyI6IkFQSSBWb2xsLm1lZCIsImV4cCI6MTY3OTkzNTExMn0.0_eZe16ZpeIHTxE4fT8INYoGLf-XdVa3r2o6Jynh8YE"
}