Ir para o conteúdo

sdk/java

SDK de servidor Java 17+ para verificação JWT sem rede, autenticaçãode requisições HTTP e validação de assinatura de webhook.

Ver como Markdown

Estado

Implementado e verificado localmente. A verificação de ida e voltacom um IdP real (busca de JWKS, assinatura/verificação de tokencontra uma instância XID ativa) ainda não foi realizada e deve serconcluída antes do uso em produção.

Instalar

Java 17+ e Maven obrigatórios.

<dependency>
  <groupId>dev.xid</groupId>
  <artifactId>xid-sdk-java</artifactId>
  <version>0.1.0-SNAPSHOT</version>
</dependency>

Início rápido

Construa um XidClient na inicialização do aplicativo e use-ocomo singleton.

import dev.xid.sdk.XidClient;
import dev.xid.sdk.XidClientOptions;
import dev.xid.sdk.XidClaims;
import dev.xid.sdk.XidTokenException;
import dev.xid.sdk.XidJwksException;

XidClient xid = XidClient.create(
    XidClientOptions.builder()
        .issuer("https://xid.dev")
        .audience("your-client-id")
        .webhookSecret("whsec_xxx")
        .build()
);

try {
    XidClaims claims = xid.verifyToken(accessToken);
    String userId = claims.getSub();
    String scope  = claims.getScope();
} catch (XidTokenException e) {
    response.sendError(401, "Unauthorized: " + e.getReason());
} catch (XidJwksException e) {
    response.sendError(503, "Service unavailable");
}

Autentica uma requisição HTTP

import dev.xid.sdk.AuthResult;

// Option A: pass Authorization header value directly
AuthResult result = xid.authenticateRequest(authHeader, null);

// Option B: pass a headers Map (Spring MVC example)
Map<String, String> headers = Collections.list(request.getHeaderNames())
    .stream()
    .collect(Collectors.toMap(h -> h, request::getHeader));
AuthResult result = xid.authenticateRequest(headers);

if (result.isAuthenticated()) {
    String userId = result.getClaims().get().getSub();
} else {
    response.sendError(401);
}

Verifica webhook

import dev.xid.sdk.XidWebhookException;

byte[] rawBody = request.getInputStream().readAllBytes();
Map<String, String> headers = Map.of(
    "svix-id",        request.getHeader("svix-id"),
    "svix-timestamp", request.getHeader("svix-timestamp"),
    "svix-signature", request.getHeader("svix-signature")
);

try {
    xid.verifyWebhook(headers, rawBody);
} catch (XidWebhookException e) {
    response.sendError(400, "Invalid webhook: " + e.getReason());
}

XidClientOptions

Método Padrão Descrição
.issuer(String) obrigatório Emissor OIDC; deve corresponder exatamente ao iss do token
.audience(String) null aud esperado; null ignora a validação
.webhookSecret(String) null Segredo do webhook (prefixo whsec_ ou base64 puro)
.jwksCacheDuration(Duration) 1 hora TTL do cache em memória do JWKS
.clockSkewTolerance(Duration) 30 segundos Tolerância de desvio de relógio para exp/nbf
.connectTimeout(Duration) 5 segundos Timeout de conexão HTTP para busca de JWKS
.readTimeout(Duration) 10 segundos Timeout de leitura HTTP para busca de JWKS

Notas da plataforma

  • Usa nimbus-jose-jwt para parsing de JWT/JWKS. ES256 éprimário; RS256 e PS256 são suportados.
  • Todas as APIs públicas são síncronas e thread-safe.
  • Logging via fachada SLF4J; traga sua própria implementação (Logback,Log4j2).
  • Hierarquia de exceções: XidException ->XidTokenException, XidJwksException,XidWebhookException.
Navegação

Digite para pesquisar...

Use as teclas de seta para navegarPressione Enter para selecionarPressione Escape para fechar