---
title: "sdk/java"
description: "SDK serveur Java 17+ pour la vérification JWT sans réseau,l'authentification des requêtes HTTP et la validation des signatureswebhook."
locale: "fr"
---

> Documentation Index
> Fetch the locale documentation index at: https://xid.dev/fr/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/java

## Statut

Implémenté et vérifié localement. La vérification aller-retour avec unvrai IdP (récupération JWKS, signature/vérification de jeton contre uneinstance XID active) n'a pas encore été effectuée et doit être complétéeavant toute utilisation en production.

## Installer

Java 17+ et Maven requis.

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

## Démarrage rapide

Construisez un seul `XidClient` au démarrage de l'application etutilisez-le comme singleton.

```java
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");
}
```

## Authentifier une requête HTTP

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

## Vérifier le webhook

```java
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éthode | Défaut | Description |
| --- | --- | --- |
| `.issuer(String)` | requis | Émetteur OIDC ; doit correspondre exactement au iss du jeton |
| `.audience(String)` | `null` | Aud attendue ; null ignore la validation |
| `.webhookSecret(String)` | `null` | Secret webhook (préfixe `whsec_` ou base64 brut) |
| `.jwksCacheDuration(Duration)` | 1 heure | TTL du cache JWKS en mémoire |
| `.clockSkewTolerance(Duration)` | 30 secondes | Tolérance au décalage d'horloge pour exp/nbf |
| `.connectTimeout(Duration)` | 5 secondes | Délai de connexion HTTP pour la récupération JWKS |
| `.readTimeout(Duration)` | 10 secondes | Délai de lecture HTTP pour la récupération JWKS |

## Notes de plateforme

- Utilise `nimbus-jose-jwt` pour l'analyse JWT/JWKS. ES256 estprincipal ; RS256 et PS256 sont pris en charge.
- Toutes les API publiques sont synchrones et thread-safe.
- Journalisation via la façade SLF4J ; apportez votre propre implémentation(Logback, Log4j2).
- Hiérarchie d'exceptions : `XidException` -&gt; `XidTokenException`,`XidJwksException`, `XidWebhookException`.

Source: https://xid.dev/fr/sdks/java/index.mdx
