Il plugin Openid-connect non riesce a recuperare la configurazione

Ho provato a capire questo per un po’ e non riesco a risolvere questo problema. Sto cercando di integrare Discourse con una configurazione Keycloak per l’autenticazione utilizzando il plugin discourse-openid-connect. Sto eseguendo discourse-docker versione 3.0.1. Al momento, facendo clic sul pulsante di accesso OpenID connect, viene visualizzato questo messaggio in Discourse: “Impossibile recuperare la configurazione dall’identity provider. Riprova.”

Sto migrando a una nuova configurazione di Discourse e la cosa divertente è che Discourse è in grado di raggiungere la schermata di accesso Keycloak utilizzando la mia vecchia istanza Keycloak senza problemi, ma non ci riesce con la mia nuova. Ciò significa che quanto segue dovrebbe essere vero:

  • le impostazioni del plugin openid-connect sono sicuramente corrette (copiate dal vecchio Discourse)
  • le impostazioni di Keycloak per il client Discourse sono sicuramente corrette (copiate dal vecchio Discourse)
  • non ci sono problemi di rete
  • non c’è alcun firewall attivo o nulla che blocchi il traffico

Inoltre, ho scoperto che posso eseguire correttamente curl all’URL del documento di discovery per Keycloak dall’istanza Discourse senza problemi. La versione di Keycloak è la stessa della precedente e l’autenticazione Keycloak funziona correttamente per altri strumenti situati nella stessa regione AWS e AZ di Discourse. Di seguito è riportato l’errore dai log quando tento di accedere utilizzando openid-connect.

Ho fatto ricerche e testato così tanto e nulla ha funzionato. L’errore relativo agli IP non consentiti sembra piuttosto generico e sono quasi certo che non ci sia alcun firewall che blocchi nulla, soprattutto perché posso eseguire curl al documento di discovery senza problemi. Posso solo pensare che forse Discourse stia cercando di recuperare il documento da una cache da qualche parte o non stia raggiungendo l’URL del token corretto, ma semplicemente non lo so. Qualsiasi aiuto sarebbe apprezzato.

Started GET "/session/csrf" for <my_ip> at 2023-02-01 18:02:24 +0000
Processing by SessionController#csrf as JSON
Completed 200 OK in 2ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 406)
Started POST "/auth/oidc" for 10.158.133.85 at 2023-02-01 18:02:24 +0000
(oidc) Setup endpoint detected, running now.
OIDC Log: Fetching discovery document from https://<keycloak_URL>.com/auth/realms/<my_realm>/.well-known/openid-configuration
OIDC Log: Fetching discovery document raised error Faraday::ConnectionFailed FinalDestination: all resolved IPs were disallowed
OIDC Log: Discovery document is

---

(oidc) Request phase initiated.
(oidc) Authentication failure! openid_connect_discovery_error: OmniAuth::OpenIDConnect::DiscoveryError, Discovery document is missing
Started GET "/auth/failure?message=openid_connect_discovery_error&strategy=oidc" for <my_ip> at 2023-02-01 18:02:24 +0000
Processing by Users::OmniauthCallbacksController#failure as HTML
  Parameters: {"message"=>"openid_connect_discovery_error", "strategy"=>"oidc"}
  Rendered users/omniauth_callbacks/failure.html.erb within layouts/no_ember (Duration: 0.1ms | Allocations: 17)
  Rendered layout layouts/no_ember.html.erb (Duration: 17.3ms | Allocations: 5113)
Completed 200 OK in 24ms (Views: 19.7ms | ActiveRecord: 0.0ms | Allocations: 6610)
1 Mi Piace

C’è una patch di sicurezza che impedisce di raggiungere indirizzi negli intervalli privati (10.0.0.0/8 e così via) per prevenire esplorazioni della rete interna.

È necessario aggiungere l’hostname in Admin - Impostazioni - Sicurezza - allowed internal hosts per aggirare il controllo.
Sarebbe stato bello se il plugin lo avesse fatto automaticamente.

2 Mi Piace

Fantastico! Quindi se aggiungo il mio keycloak qui dovrebbe funzionare? Lo farei con l’URL o con l’IP?

EDIT: Lascia perdere, ha funzionato. Grazie mille! Ho passato così tanto tempo su questo ed era una soluzione così semplice.

2 Mi Piace

@joshml.extra che coincidenza, sto affrontando esattamente lo stesso problema con l’integrazione Keycloak oidc e la soluzione che @RGJ ha fornito è promettente. Ci ho provato, ma nel mio caso ha funzionato solo per un IP, un IP di un pod Kubernetes.

@RGJ - È possibile che il DNS funzioni allo stesso modo? Nel mio caso si tratta di un URL Nginx Ingress e vedo un errore di verifica del certificato poiché ho certificati interni firmati da una CA sul mio Nginx Controller. L’URL di ingress si risolve in un IP privato.

Grazie per questo argomento!! Lo apprezzo molto :slightly_smiling_face:. Stavo quasi per rinunciare a trovare una soluzione per il nostro scenario air gapped.

Questo non sembra essere il tuo problema con un IP privato. Dopotutto, se le cose fossero bloccate a causa dell’IP privato, non arriveresti mai a un fallimento della verifica del certificato?

Capito! Ha senso.

Grazie per la spiegazione. Funziona bene per me con un IP / hostname.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.