{"record":{"id":"20450b7aee289fa3","repo":"SonarSource/sonarqube","slug":"identity-provider-s-does-not-exist-or-is-not-enab","errorCode":null,"errorMessage":"Identity provider %s does not exist or is not enabled","messagePattern":"Identity provider (.+?) does not exist or is not enabled","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":400,"severity":"error","filePath":"server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/IdentityProviderRepository.java","lineNumber":48,"sourceCode":"import org.sonar.api.server.authentication.IdentityProvider;\n\npublic class IdentityProviderRepository {\n  private static final Predicate<IdentityProvider> IS_ENABLED_FILTER = IdentityProvider::isEnabled;\n  private static final Function<IdentityProvider, String> TO_NAME = IdentityProvider::getName;\n\n  protected final Map<String, IdentityProvider> providersByKey = new HashMap<>();\n\n  public IdentityProviderRepository(@Nullable List<IdentityProvider> identityProviders) {\n    Optional.ofNullable(identityProviders)\n      .ifPresent(list -> list.forEach(i -> providersByKey.put(i.getKey(), i)));\n  }\n\n  public IdentityProvider getEnabledByKey(String key) {\n    IdentityProvider identityProvider = providersByKey.get(key);\n    if (identityProvider != null && IS_ENABLED_FILTER.test(identityProvider)) {\n      return identityProvider;\n    }\n    throw new IllegalArgumentException(String.format(\"Identity provider %s does not exist or is not enabled\", key));\n  }\n\n  public List<IdentityProvider> getAllEnabledAndSorted() {\n    return providersByKey.values().stream()\n      .filter(IS_ENABLED_FILTER)\n      .sorted(Comparator.comparing(TO_NAME))\n      .toList();\n  }\n\n}\n","sourceCodeStart":30,"sourceCodeEnd":59,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/IdentityProviderRepository.java#L30-L59","documentation":"IdentityProviderRepository.getEnabledByKey returns the identity provider (SAML, GitHub, etc.) registered under a key only if it is enabled, otherwise it throws IllegalArgumentException. The same message covers both 'no such provider' and 'provider exists but is disabled', deliberately not distinguishing them.","triggerScenarios":"Calling getEnabledByKey(key) when the identity provider key is not configured in sonar.properties (sonar.auth.* settings) or the provider is registered but disabled — e.g. during SSO login redirects referencing a provider that was turned off.","commonSituations":"Users hitting login links for a provider disabled by an administrator after migration; typos in provider keys in external login buttons; authentication config changes (sonar.auth.github.enabled=false) while old links remain in bookmarks.","solutions":["Verify the provider key against the configured identity providers in Administration > Security","Enable the identity provider (e.g. sonar.auth.github.enabled=true) and restart the server","Update the login entry point/links to use an enabled provider key"],"exampleFix":"// before\nIdentityProvider provider = identityProviderRepository.getEnabledByKey(request.getParameter(\"provider\"));\n// after\nString key = request.getParameter(\"provider\");\nIdentityProvider provider = identityProviderRepository.getAllEnabledAndSorted().stream()\n  .filter(p -> p.getKey().equals(key))\n  .findFirst()\n  .orElseThrow(() -> new BadRequestException(\"Identity provider is not available: \" + key));","handlingStrategy":"validation","validationCode":"boolean providerAvailable = identityProviderRepository.getAllEnabledAndSorted().stream()\n  .anyMatch(p -> p.getKey().equals(providerKey));\nif (!providerAvailable) { throw new BadRequestException(\"Identity provider unavailable: \" + providerKey); }","typeGuard":"Optional<IdentityProvider> findEnabledProvider(IdentityProviderRepository repo, String key) {\n  return repo.getAllEnabledAndSorted().stream().filter(p -> p.getKey().equals(key)).findFirst();\n}","tryCatchPattern":"try {\n  IdentityProvider provider = repo.getEnabledByKey(key);\n  // start login flow\n} catch (IllegalArgumentException e) {\n  if (!e.getMessage().startsWith(\"Identity provider\")) throw e;\n  // render login page with only enabled providers instead of failing\n}","preventionTips":["Render login buttons only from getAllEnabledAndSorted() rather than hardcoded keys","After disabling a provider, update or remove external links/bookmarks that reference it","Document provider key configuration (sonar.auth.*.enabled) in deployment runbooks"],"tags":["java","authentication","sso","sonarqube"],"backgroundTag":"resource-not-found","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}