quarkusio/quarkus · error · ConfigurationException

configuration id ' ' duplicates the default configuration id

Error message

configuration id '<key>' duplicates the default configuration id

What it means

Named (non-default) OIDC configurations must use a config key different from the default configuration's id. If a named config key equals the default id, Quarkus cannot disambiguate the two configurations and throws at startup.

Solutions

  1. Rename the named config key so it differs from the default configuration id
  2. Or set quarkus.oidc.<key>.configuration-id... actually change the key: use a distinct key in the config path quarkus.oidc."<new-key>"
  3. Merge the named block into the default configuration if they are meant to be the same

Example fix

// before
quarkus.oidc.auth-server-url=https://idp.example.com
quarkus.oidc.myapp.configuration-id=myapp   // 'myapp' key duplicates default id
quarkus.oidc."myapp".auth-server-url=...
// after
quarkus.oidc.myapp.auth-server-url=https://idp.example.com
quarkus.oidc."service-a".auth-server-url=...
Defensive patterns

Strategy: validation

Validate before calling

String defaultId = "<default-config-id>";
Set<String> namedKeys = Set.of("key1","key2"); // from config scanning
if (namedKeys.contains(defaultId)) throw new IllegalStateException("Named config key " + defaultId + " duplicates default id");

Prevention

When it happens

Trigger: A named config block (e.g. quarkus.oidc-client."<key>" or quarkus.oidc."<key>") whose <key> equals the default configuration's id passed to verifyConfigurationId.

Common situations: Renaming the default tenant/config id but leaving a named block keyed with the old default name; scaffolding tools generating named configs that collide with the default id.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/771560d1847148d9. Report an issue: GitHub.

Appendix: source

Thrown at extensions/oidc-common/runtime/src/main/java/io/quarkus/oidc/common/runtime/OidcCommonUtils.java:593

    private static Map<String, Object> additionalClaims(Map<String, String> claims) {
        return (Map) claims;
    }

    private static SignatureAlgorithm getSignatureAlgorithm(Credentials credentials, SignatureAlgorithm defaultAlgorithm) {
        if (credentials.jwt().signatureAlgorithm().isPresent()) {
            try {
                return SignatureAlgorithm.fromAlgorithm(credentials.jwt().signatureAlgorithm().get());
            } catch (Exception ex) {
                throw new ConfigurationException("Unsupported signature algorithm");
            }
        } else {
            return defaultAlgorithm;
        }
    }

    public static void verifyConfigurationId(String defaultId, String configKey, Optional<String> configId) {
        if (configKey.equals(defaultId)) {
            throw new ConfigurationException("configuration id '" + configKey + "' duplicates the default configuration id");
        }
        if (configId.isPresent() && !configKey.equals(configId.get())) {
            throw new ConfigurationException("Configuration has 2 different id values: '"
                    + configKey + "' and '" + configId.get() + "'");
        }

    }

    public static String initClientSecretBasicAuth(OidcClientCommonConfig oidcConfig, String clientSecret) {
        if (clientSecret != null && isClientSecretBasicAuthRequired(oidcConfig.credentials())) {
            return basicSchemeValue(oidcConfig.clientId().get(), clientSecret);
        }
        return null;
    }

    public static String basicSchemeValue(String name, String secret) {
        return OidcConstants.BASIC_SCHEME + " "
                + Base64.getEncoder().encodeToString((name + ":" + secret).getBytes(StandardCharsets.UTF_8));

View on GitHub (pinned to e1c734241f)