Estamos utilizando OAuth externo para la autenticación de usuarios. Ocasionalmente, los usuarios reciben un error 500 al acceder a la plataforma: Fragmento del registro de errores:
Started GET "/auth/oauth2_basic/callback?code=[coderemoved]&state=[stateremoved]" for [IP] at [timestamp]
(oauth2_basic) Setup endpoint detected, running now.
(oauth2_basic) Callback phase initiated.
Faraday::TimeoutError (Timeout::Error)
lib/final_destination/resolver.rb:31:in `block in lookup'
lib/final_destination/resolver.rb:8:in `synchronize'
lib/final_destination/resolver.rb:8:in `lookup'
lib/final_destination/ssrf_detector.rb:127:in `lookup_ips'
lib/final_destination/ssrf_detector.rb:95:in `lookup_and_filter_ips'
lib/final_destination/http.rb:13:in `connect'
lib/middleware/omniauth_bypass_middleware.rb:43:in `call'
lib/middleware/content_security_policy.rb:12:in `call'
lib/middleware/anonymous_cache.rb:387:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'
Si el usuario simplemente recarga la página, todo funciona, con la siguiente información en el registro:
Started GET "/auth/oauth2_basic/callback?code=[coderemoved]&state=[stateremoved]" for [IP] at [timestamp]
(oauth2_basic) Setup endpoint detected, running now.
(oauth2_basic) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#complete as HTML
Parameters: {"code"=>"[coderemoved]", "state"=>"[stateremoved]", "provider"=>"oauth2_basic"}
Deprecation notice: `SiteSetting.anonymous_posting_min_trust_level` has been deprecated. Please use `SiteSetting.anonymous_posting_allowed_groups` instead. (removal in Discourse 3.3)
At /var/www/discourse/lib/site_setting_extension.rb:160:in `public_send`
start
Redirected to https://[pageremoved]
Completed 302 Found in 83ms (ActiveRecord: 0.0ms | Allocations: 11138)
Lamentablemente, no hay pasos para reproducirlo. Tiende a ocurrir cuando los usuarios que han estado inactivos durante un período de tiempo más largo, pero no puedo confirmarlo con certeza. Es posible que haya habido una actualización de la plataforma desde su última visita.
¿Alguna sugerencia o información adicional que pudiera proporcionar?
Estaba pensando eso, pero el error surge demasiado rápido para que sea un comportamiento normal. Me pregunto si podría haber un tiempo de espera excesivamente agresivo en la búsqueda de DNS en algún lugar:
El error está en “resolver.rb”.
Se soluciona temporalmente al actualizar, cuando la búsqueda de DNS estaría en caché.
Por alguna razón completamente inexplicable, no puedo hacer que lea el documento de descubrimiento OIDC desde ninguna URL que involucre nuestro DNS autoalojado. Esto a pesar de que puedo hacer curl del archivo manualmente desde la instancia de docker. He eliminado muchas variables diferentes y el DNS parece ser el único factor común.
Es importante destacar que el servidor Discourse puede comunicarse con el servidor OIDC, incluso cuando falla de esta manera. De los registros de acceso, hay una solicitud:
cuando tiene éxito. Independientemente, nunca tarda más de 5 segundos. Aún no he intentado configurar un proxy para el servidor OIDC que utilice DNS de Cloudflare, pero ese será mi próximo paso.
Bueno, definitivamente es DNS. En lugar de configurar un proxy, simplemente agregué mi servidor OIDC al archivo hosts en el contenedor de Docker y ahora parece funcionar. Sin embargo, esta es una solución frágil y subóptima; creo que los desarrolladores deben solucionar el tiempo de espera para que sea algo sensato. Este caso me recuerda la historia del correo electrónico de 500 millas.
En mi caso, las VM de IdP y Discourse están una al lado de la otra y, si bien nadie puede excluir por completo posibles problemas de red, ningún otro servicio los experimenta.