enhancement
major
minor
defect
critical
major
minor
major
#30173
Die OIDC-Anmeldeschaltfläche wird angezeigt, obwohl der Client weder über eine Discovery-URI noch über Anbieter-Metadaten verfügt.
Problem
Die Anmeldeseite stellt einen pac4j-OIDC-Client (DefaultOidcClientConfigurator) bereit, sobald dessen Geheimnis vorhanden ist. isAvailable() überprüft lediglich das Geheimnis. Ein Client, dessen discovery-uri leer ist und der keine provider-metadata besitzt, erhält dennoch seine Schaltfläche. Ein Klick darauf löst eine ` OidcConfigurationException` aus („Sie müssen entweder die Discovery-URL definieren…“) und kehrt ohne weitere Meldung zur Anmeldeseite zurück.
Dies ist relevant für Anwendungen, deren OIDC-Einstellungen aus Bereitstellungsvariablen stammen. Eine Bereitstellung, die über ein Geheimnis, aber keine Discovery-URI verfügt (beispielsweise ein aus einer früheren Konfiguration übrig gebliebenes Geheimnis), zeigt eine Schaltfläche an, die nicht funktionieren kann, und der Benutzer erhält keine Erklärung.
Design
- DefaultOidcClientConfigurator.isAvailable() gibt ebenfalls „false“ zurück, solange weder die Discovery-URI noch die Anbieter-Metadaten konfiguriert sind. Unterklassen, die die Discovery-URI selbst ableiten (Keycloak aus base-uri und realm, Azure, Google), verwenden den abgeleiteten Wert.
- Ein fehlendes Element wird einmalig beim Start als Warnung unter Angabe des Clients protokolliert, nicht als Ausnahme bei jedem Klick.
Akzeptanz
- Ein Client mit einem Secret, aber einer leeren `discovery-uri ` und ohne `provider-metadata` erhält auf der Anmeldeseite keine Schaltfläche.
- Bei Vorhandensein einer Discovery-URI oder von Provider-Metadaten wird die Schaltfläche wie bisher angezeigt. Keycloak-, Azure- und Google-Clients bleiben unverändert.
Entdeckt durch die Steuerungsanwendung tl-factory (Bereitstellungseinstellung ihres Anmeldeprozesses, Gitea-Issue TopLogic/tl-factory#45).
Lösung
- „DefaultOidcClientConfigurator“ erhält den Hook „hasProviderMetadataSource()“: true, wenn „discovery-uri“ nicht leer ist oder „provider-metadata“ gesetzt ist. „isAvailable()“ ist eine Kombination aus „hasProviderMetadataSource()“ und der Verfügbarkeit des Geheimnisses.
- Die Keycloak-, Azure- und Google-Konfiguratoren geben „true“ zurück: Ihr pac4j-Client leitet die Discovery-URI selbst aus den obligatorischen Einstellungen (base-uri/`realm`, tenant) ab, sodass eine fehlende Eingabe bereits beim Laden der Konfiguration gemeldet wird.
- Ohne eine Quelle für die Anbieter-Metadaten protokolliert der Konfigurator bei seiner Erstellung eine Warnung, in der der Client genannt wird; auf der Anmeldeseite wird keine Schaltfläche dafür angezeigt.
- Nicht im Umfang enthalten: die Überprüfung, ob die Discovery-URI erreichbar oder gültig ist.