Get and refresh access tokens from OpenID Connect providers
npx @tessl/cli install tessl/maven-io-quarkus--quarkus-oidc-client@3.26.0The Quarkus OIDC Client extension provides OpenID Connect (OIDC) client functionality for obtaining and refreshing access tokens from OIDC providers. It supports various OAuth2/OIDC grant types and integrates seamlessly with Quarkus's reactive programming model using Mutiny for asynchronous operations.
pom.xml:<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-client</artifactId>
<version>3.26.2</version>
</dependency>import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.oidc.client.Tokens;
import io.quarkus.oidc.client.runtime.OidcClientConfig;
import io.quarkus.oidc.client.OidcClientConfigBuilder;import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.oidc.client.Tokens;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.Map;
@ApplicationScoped
public class TokenService {
@Inject
OidcClient oidcClient;
@Inject
OidcClients oidcClients;
public void getTokens() {
// Get tokens using default client
Uni<Tokens> tokens = oidcClient.getTokens();
// Get tokens with additional parameters
Map<String, String> additionalParams = Map.of("scope", "read write");
Uni<Tokens> tokensWithParams = oidcClient.getTokens(additionalParams);
// Refresh tokens
String refreshToken = "existing_refresh_token";
Uni<Tokens> refreshedTokens = oidcClient.refreshTokens(refreshToken);
// Use named client
OidcClient namedClient = oidcClients.getClient("my-provider");
Uni<Tokens> namedTokens = namedClient.getTokens();
}
}The Quarkus OIDC Client extension is built around several key components:
OidcClient provides reactive token operations with Mutiny Uni<T> return typesOidcClients manages multiple OIDC client instances and configurationsTokens class encapsulates access and refresh tokens with expiration trackingCore OIDC client functionality for token operations including obtaining, refreshing, and revoking tokens. All operations return Mutiny Uni<T> for reactive processing.
public interface OidcClient extends Closeable {
Uni<Tokens> getTokens();
Uni<Tokens> getTokens(Map<String, String> additionalGrantParameters);
Uni<Tokens> refreshTokens(String refreshToken);
Uni<Tokens> refreshTokens(String refreshToken, Map<String, String> additionalGrantParameters);
Uni<Boolean> revokeAccessToken(String accessToken);
Uni<Boolean> revokeAccessToken(String accessToken, Map<String, String> additionalParameters);
}
public interface OidcClients extends Closeable {
OidcClient getClient();
OidcClient getClient(String id);
Uni<OidcClient> newClient(OidcClientConfig clientConfig);
}Configuration system supporting both builder pattern for programmatic setup and annotation-based configuration. Supports multiple OIDC providers and grant types.
public interface OidcClientConfig extends OidcClientCommonConfig {
Optional<String> id();
Optional<Boolean> clientEnabled();
Optional<List<String>> scopes();
Optional<List<String>> audience();
Optional<Duration> refreshTokenTimeSkew();
Grant grant();
static OidcClientConfigBuilder builder() { /* ... */ }
static OidcClientConfigBuilder authServerUrl(String authServerUrl) { /* ... */ }
}
public class OidcClientConfigBuilder {
public OidcClientConfigBuilder id(String id);
public OidcClientConfigBuilder scopes(List<String> scopes);
public OidcClientConfigBuilder audience(List<String> audience);
public GrantBuilder grant();
public OidcClientConfig build();
}Token container and management functionality providing access to tokens, expiration tracking, and automatic refresh capabilities.
public class Tokens {
public Tokens(String accessToken, Long accessTokenExpiresAt, Duration refreshTokenTimeSkew,
String refreshToken, Long refreshTokenExpiresAt, JsonObject grantResponse, String clientId);
public String getAccessToken();
public String getRefreshToken();
public String getClientId();
public Object get(String propertyName);
public Long getAccessTokenExpiresAt();
public Duration getRefreshTokenTimeSkew();
public boolean isAccessTokenExpired();
public boolean isRefreshTokenExpired();
public boolean isAccessTokenWithinRefreshInterval();
}CDI injection support, JAX-RS client filter integration, and SPI interfaces for extending OIDC client functionality.
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, PARAMETER, METHOD})
public @interface NamedOidcClient {
String value();
}
@Target({TYPE})
@Retention(RUNTIME)
public @interface OidcClientFilter {
String value() default "";
}
public interface TokenProvider {
Uni<String> getAccessToken();
}The extension supports all major OAuth2/OIDC grant types:
client_credentials) - Client credentials grantpassword) - Resource owner password credentials grantauthorization_code) - Authorization code granturn:ietf:params:oauth:grant-type:token-exchange) - Token exchange granturn:ietf:params:oauth:grant-type:jwt-bearer) - JWT bearer grantrefresh_token) - Refresh token granturn:openid:params:grant-type:ciba) - Client Initiated Backchannel Authenticationurn:ietf:params:oauth:grant-type:device_code) - Device authorization grant