ether-jwt provee emisión y verificación de JWT a través de las interfaces TokenIssuer y TokenVerifier, con modelos inmutables TokenSpec y TokenClaims.
Instalación
<dependency>
<groupId>dev.rafex.ether.jwt</groupId>
<artifactId>ether-jwt</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
Emitir un token
TokenIssuer issuer = new DefaultTokenIssuer(config);
String token = issuer.issue(TokenSpec.builder()
.subject("user-123")
.issuer("my-app")
.audience("api")
.ttl(Duration.ofHours(1))
.roles("USER", "ADMIN")
.tokenType(TokenType.ACCESS)
.claim("tenantId", "acme")
.build());
Verificar un token
TokenVerifier verifier = new DefaultTokenVerifier(config);
VerificationResult result = verifier.verify(token, Instant.now());
if (result.isValid()) {
TokenClaims claims = result.claims();
String subject = claims.subject();
List<String> roles = claims.roles();
String tenantId = (String) claims.extras().get("tenantId");
} else {
throw new UnauthorizedException("Token inválido");
}
TokenSpec — especificación del token
TokenSpec spec = TokenSpec.builder()
.subject("user-123")
.issuer("my-app")
.audience("api")
.ttl(Duration.ofMinutes(30))
.notBefore(Instant.now())
.jwtId(UUID.randomUUID().toString())
.roles("USER")
.tokenType(TokenType.REFRESH)
.clientId("mobile-app")
.claim("orgId", "org-456")
.build();
TokenClaims claims = spec.claims();
TokenClaims — claims extraídos
TokenClaims claims = result.claims();
String subject = claims.subject();
String issuer = claims.issuer();
String audience = claims.audience();
Instant expiresAt = claims.expiresAt();
Instant issuedAt = claims.issuedAt();
String jwtId = claims.jwtId();
List<String> roles = claims.roles();
TokenType type = claims.tokenType();
String clientId = claims.clientId();
Map<String,?> extras = claims.extras();
Tipos de token y algoritmos
TokenType.ACCESS
TokenType.REFRESH
TokenType.ID
AlgorithmType.HS256
AlgorithmType.RS256
AlgorithmType.ES256
SignType.SYMMETRIC
SignType.ASYMMETRIC
Integración con ether-di
public class SecurityContainer {
private final Lazy<TokenIssuer> issuer = new Lazy<>(() ->
new DefaultTokenIssuer(config.get()));
private final Lazy<TokenVerifier> verifier = new Lazy<>(() ->
new DefaultTokenVerifier(config.get()));
public TokenIssuer tokenIssuer() { return issuer.get(); }
public TokenVerifier tokenVerifier() { return verifier.get(); }
}
Más información