El plugin Openid-connect no puede obtener la configuración

He estado intentando resolver esto durante un tiempo y no parece que pueda solucionar este problema. Estoy intentando integrar Discourse con una configuración de Keycloak para la autenticación utilizando el plugin discourse-openid-connect. Estoy ejecutando discourse-docker versión 3.0.1. Ahora mismo, al hacer clic en el botón de inicio de sesión de OpenID connect, aparece este mensaje en Discourse: “No se puede obtener la configuración del proveedor de identidad. Inténtalo de nuevo”.

Estoy migrando a una nueva configuración de Discourse, y lo curioso es que Discourse puede acceder a la pantalla de inicio de sesión de Keycloak utilizando mi antigua instancia de Keycloak sin problemas, pero no puede hacerlo con la nueva. Esto significa que lo siguiente debería ser cierto:

  • La configuración del plugin openid-connect es definitivamente correcta (copiada del antiguo Discourse).
  • La configuración de Keycloak para el cliente de Discourse es definitivamente correcta (copiada del antiguo Discourse).
  • No hay ningún problema de red.
  • No hay ningún firewall activado ni nada que bloquee el tráfico.

Además, he descubierto que puedo hacer curl a la URL del documento de descubrimiento para Keycloak desde la instancia de Discourse sin problemas. La versión de Keycloak es la misma que la antigua, y la autenticación de Keycloak funciona bien para otras herramientas ubicadas en la misma región de AWS y AZ que Discourse. A continuación, se muestra el error de los registros cuando intento iniciar sesión usando openid-connect.

He investigado y probado muchas cosas y nada ha funcionado. El error sobre las IP no permitidas parece bastante genérico, y estoy casi seguro de que no hay ningún firewall que bloquee nada, especialmente porque puedo hacer curl al documento de descubrimiento sin problemas. Solo se me ocurre que posiblemente Discourse esté intentando obtener el documento de una caché en algún lugar o no esté accediendo a la URL de token correcta, pero simplemente no lo sé. Cualquier ayuda sería apreciada.

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 me gusta

Hay un parche de seguridad que prohíbe el acceso a direcciones en rangos privados (10.0.0.0/8 y similares) para prevenir la exploración de redes internas.

Necesitas añadir el nombre de host en Admin - Ajustes - Seguridad - allowed internal hosts para omitir la comprobación.
Hubiera sido bueno que el plugin hiciera eso por ti.

2 Me gusta

¡Genial! Entonces, si agrego mi keycloak aquí, ¿funcionará? ¿Lo haría con la URL o con la IP?

EDITAR: Olvídalo, esto funcionó. Muchas gracias. He pasado mucho tiempo en esto y fue una solución muy simple.

2 Me gusta

@joshml.extra qué coincidencia, estoy teniendo exactamente el mismo problema con la integración de Keycloak oidc y la solución que @RGJ ha dado es prometedora. Lo he intentado, pero solo funcionó para una IP en mi caso una IP de pod de Kubernetes.

@RGJ: ¿Es posible que un DNS funcione de la misma manera? En mi caso, es una URL de Nginx Ingress y veo un error de verificación de certificado, ya que tengo certificados firmados por una CA interna en mi controlador Nginx. La URL de ingress se resuelve en una IP privada.

¡¡Muchas gracias por este tema!! Realmente lo aprecio :slightly_smiling_face:. Casi me había rendido en encontrar una solución para nuestro escenario aislado (air gapped).

Esto no suena como si tu problema fuera una IP privada. Después de todo, si las cosas se bloquearan debido a la IP privada, ¿nunca llegarías a un fallo en la verificación del certificado?

¡Entendido! Tiene sentido.

Gracias por la explicación. Me funciona bien con una IP / nombre de host.

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