Service Provider Interface for Keycloak authentication adapters across different application server environments
npx @tessl/cli install tessl/maven-org-keycloak--keycloak-adapter-spi@26.2.0The Keycloak Adapter SPI (Service Provider Interface) is a Java library that defines the core interfaces and contracts for building Keycloak authentication adapters across different application server environments. It provides abstractions for HTTP request/response handling, session management, user authentication state, and error handling, enabling consistent authentication adapter implementations across various platforms like Jakarta EE, Spring, and other Java application servers.
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-adapter-spi</artifactId>
<version>26.2.5</version>
</dependency>import org.keycloak.adapters.spi.*;For specific interfaces:
import org.keycloak.adapters.spi.HttpFacade;
import org.keycloak.adapters.spi.AuthOutcome;
import org.keycloak.adapters.spi.AuthChallenge;
import org.keycloak.adapters.spi.KeycloakAccount;
import org.keycloak.adapters.spi.SessionIdMapper;
import org.keycloak.adapters.spi.InMemorySessionIdMapper;
import org.keycloak.adapters.spi.SessionIdMapperUpdater;
import org.keycloak.adapters.spi.UserSessionManagement;
import org.keycloak.adapters.spi.AdapterSessionStore;
import org.keycloak.adapters.spi.AuthenticationError;
import org.keycloak.adapters.spi.LogoutError;import org.keycloak.adapters.spi.*;
import javax.security.cert.X509Certificate;
// Implement HTTP facade for your platform
public class MyHttpFacade implements HttpFacade {
@Override
public Request getRequest() { /* implementation */ }
@Override
public Response getResponse() { /* implementation */ }
@Override
public X509Certificate[] getCertificateChain() { /* implementation */ }
}
// Use session mapping for multi-session management
SessionIdMapper sessionMapper = new InMemorySessionIdMapper();
sessionMapper.map("sso-session-123", "user@example.com", "http-session-456");
// Handle authentication outcomes
public void handleAuth(AuthOutcome outcome) {
switch (outcome) {
case AUTHENTICATED:
// Process successful authentication
break;
case FAILED:
// Handle authentication failure
break;
case NOT_ATTEMPTED:
// No authentication attempted
break;
// ... handle other outcomes
}
}The Keycloak Adapter SPI follows a clean interface-based design with several key components:
HttpFacade provides platform-agnostic HTTP request/response handlingAdapterSessionStore for preserving request state during authentication flowsAuthChallenge interface for implementing protocol-specific authentication challengesThis architecture enables platform-specific adapter implementations while maintaining consistent authentication patterns across different Java web frameworks and application servers.
Platform-agnostic HTTP handling with request and response facades, cookie management, and certificate chain access. Essential for building adapters that work across different web frameworks.
public interface HttpFacade {
Request getRequest();
Response getResponse();
X509Certificate[] getCertificateChain();
}Comprehensive session mapping and management capabilities for correlating SSO sessions with application sessions, including user session management and request storage.
public interface SessionIdMapper {
boolean hasSession(String id);
void clear();
Set<String> getUserSessions(String principal);
String getSessionFromSSO(String sso);
void map(String sso, String principal, String session);
void removeSession(String session);
}
public class InMemorySessionIdMapper implements SessionIdMapper {
// Thread-safe in-memory implementation
}Authentication outcome tracking, user account representation, and error handling for comprehensive authentication flow management.
public enum AuthOutcome {
NOT_ATTEMPTED, FAILED, AUTHENTICATED, NOT_AUTHENTICATED, LOGGED_OUT
}
public interface KeycloakAccount {
Principal getPrincipal();
Set<String> getRoles();
}
public interface AuthChallenge {
boolean challenge(HttpFacade exchange);
int getResponseCode();
}public interface SessionIdMapperUpdater {
void clear(SessionIdMapper idMapper);
void map(SessionIdMapper idMapper, String sso, String principal, String httpSessionId);
void removeSession(SessionIdMapper idMapper, String httpSessionId);
boolean refreshMapping(SessionIdMapper idMapper, String httpSessionId);
// Predefined update strategies
SessionIdMapperUpdater DIRECT = /* direct update implementation */;
SessionIdMapperUpdater EXTERNAL = /* external update implementation */;
}
public interface UserSessionManagement {
void logoutAll();
void logoutHttpSessions(List<String> ids);
}
public interface AdapterSessionStore {
void saveRequest();
boolean restoreRequest();
}// Marker interfaces for error identification
public interface AuthenticationError {
// Marker interface - specific protocols implement subclasses
}
public interface LogoutError {
// Marker interface - specific protocols implement subclasses
}