Ce module fournit des outils de haut niveau pour intégrer ScribeJava dans des systèmes d'authentification existants (Spring, Quarkus, Jakarta EE, etc.).
TokenAutoRenewer: Gère le rafraîchissement automatique des jetons de manière thread-safe.AuthorizedClientService: Orchestre le renewer pour exécuter des appels API signés de manière transparente.AuthFlowCoordinator: Coordonne la fin du flux (Callback), validant lestateet sauvant le jeton.TokenRepository: Interface d'abstraction pour stocker vos jetons (DB, Redis, Session).StateGenerator: Générateur sécurisé de paramètrestatepour la protection CSRF.ExpiringTokenWrapper: Encapsule un jeton avec sa date d'expiration calculée.
Implémentez l'interface pour brancher votre système de stockage :
public class RedisTokenRepository implements TokenRepository<String, ExpiringTokenWrapper> {
@Override
public void save(String userId, ExpiringTokenWrapper wrapper) {
redis.set(userId, serialize(wrapper));
}
// ... implémenter findByKey et deleteByKey
}Utilisez le renewer pour obtenir systématiquement un jeton valide. S'il est expiré, il sera rafraîchi automatiquement.
TokenAutoRenewer<String> renewer = new TokenAutoRenewer<>(
repository,
oldToken -> service.refreshAccessToken(oldToken.getRefreshToken())
);
// Dans votre logique métier :
OAuth2AccessToken validToken = renewer.getValidToken(userId);
// L'appel ci-dessus est thread-safe : si deux threads appellent en même temps pour le même utilisateur,
// un seul fera l'appel réseau de rafraîchissement.StateGenerator stateGenerator = new StateGenerator();
// 1. Avant redirection
String state = stateGenerator.generate();
session.setAttribute("oauth_state", state);
// 2. Au retour du serveur
String returnedState = request.getParameter("state");
if (!state.equals(returnedState)) {
throw new SecurityException("CSRF Detected!");
}Ce service est le point d'entrée recommandé pour faire vos appels API. Il s'occupe de tout : récupération, rafraîchissement si nécessaire, signature et exécution.
AuthorizedClientService<String> client = new AuthorizedClientService<>(service, renewer);
OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.github.com/user");
try (Response response = client.execute(userId, request)) {
System.out.println(response.getBody());
}Simplifie la réception du code d'autorisation.
AuthFlowCoordinator<String> coordinator = new AuthFlowCoordinator<>(service, repository);
// Appelé dans votre contrôleur de callback /oauth/callback
try {
AuthResult result = coordinator.finishAuthorization(userId, code, stateParam, sessionState);
System.out.println("Authentification réussie !");
} catch (SecurityException e) {
// Tentative de CSRF détectée
}- Expiration Buffer : Par défaut,
TokenAutoRenewerrafraîchit le jeton s'il expire dans moins de 60 secondes. Vous pouvez ajuster ce délai dans le constructeur. - Sécurité du State : Utilisez toujours
StateGeneratorpour garantir une entropie suffisante (32 octets par défaut).