Problemas esporádicos de inicio de sesión de DiscourseSSO con nonce caducado

Usamos DiscourseSSO y, esporádicamente, los usuarios tienen problemas para iniciar sesión (similar a Sporadic issue wp-discourse/SSO: Nonce has already expired). Estuve intentando depurar esto agregando algunos registros adicionales y, afortunadamente, me encontré con el problema después de un par de días. Para ser claros, el inicio de sesión funciona la mayoría de las veces, solo que esporádicamente (tal vez durante 5 minutos al día) los usuarios tienen problemas para iniciar sesión.

Usamos una configuración de subcarpeta en un clúster multinodo, utilizando una base de datos compartida externa y Redis si eso marca alguna diferencia. Hay dos escenarios de fallo:

  1. Nonce expirado
    Cuando el usuario es redirigido a /session/sso_login, SessionController no recibe session_id en la sesión y, por lo tanto, no puede buscar el nonce. Intenté registrar la sesión (Rails.logger.warn(\"Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}\")) y mostró una sesión vacía. Verifiqué que el navegador está enviando la cookie “_forum_session” como se recibió en la solicitud anterior y la cookie se registra en el servidor si se registra en SessionController (Rails.logger.warn(\"Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}\")).

  2. El inicio de sesión se completa pero el usuario recibe un error de inicio de sesión en la pantalla
    Cuando el usuario es redirigido a /session/sso_login, SessionController puede verificar los datos SSO e iniciar sesión del usuario (veo Verbose SSO log: User was logged on user5 en los registros). Pero cuando redirige al usuario a /forums/latest, el usuario ve un error en la pantalla. Noté que en el flujo de trabajo exitoso esta acción borra/devuelve una cookie “cn” vacía, pero en el escenario de fallo, simplemente actualiza y devuelve la cookie “_t”. Mi suposición es que este escenario también podría estar relacionado con la falta de datos de sesión.

Si esperamos unos 5 minutos y volvemos a intentarlo, todo vuelve a funcionar bien.

No he probado si todos los usuarios que acceden al sitio en ese momento tienen el problema o no, pero me han dicho anecdóticamente que varios usuarios lo encontraron una vez en nuestra instancia.

¡Hola!

¿Qué utilizas para la configuración de subcarpetas? Si tienes algún tipo de firewall de aplicaciones web delante de Discourse, podría valer la pena comprobar si hay problemas de caché. En nuestra experiencia, eso es lo primero que hay que descartar.

Gracias por tu respuesta Leonardo. Usamos nginx como nuestra puerta de enlace principal que envía URL basadas en rutas al nginx dentro del contenedor de Discourse.

Agregué estas dos líneas al principio de session_controller.rb/sso y session_controller.rb/sso_login

    if SiteSetting.verbose_discourse_connect_logging
      Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")
      Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")
    end

Para el primer escenario de falla mencionado anteriormente, obtuve lo siguiente para /sso (en el nodo1 del clúster multinodo)

Verbose SSO log: Cookies cn=12,_forum_session=ZjBveGorRVN1bU0zeGRKVHZtWUZDamUxTUJSUkJHUDZDaHhLMkh3U0lXMlpCYS9PTnpJWEovcTlZVDFTSTJuNkVNUE9NdlNvVWlidStIdk9SeTlRYzZ5YVp0N0pXdmhnTldlaSt4d1o3TC9mUm1nSUhsOUtiWFRyVGZBYkJLRHRRR0lFZmM0RkVxLzl0V2JEODR4NGMxQUJvOGhpdVc0c2JsdDFESHo2TWxJPS0tRXZTL0FHZlM1Yy9QVWJkc2xaaTYvUT09--36fa626c698a401db1e7f13276ee6bfde16dea77,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session
Verbose SSO log: Setting nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336

y lo siguiente para /sso_login (en el nodo2 del clúster multinodo)

Verbose SSO log: Cookies cn=12,_forum_session=WFRkNThYYUZwUnlOQjF5VHdUZGRUWE1UNUx2a3Z5ZlJCOGl0VFRRUlF2bm5vQUQzMWdaUVZVUnJkNmdIUjlRTE52d1B5MXJnV0svWkJMRWZrOU5XellvV0IzMTBScERwM0lzT3VIUWc2SEppb2xpTlkxaFpuc1dvU2d4SkdZRXFYYjJzakRQTXFmS2lYTlhxVEd5Zi9nQ3dZQnVUR1pDSndScGZhcVNJOW1ZPS0tNFduSE1YRDk5cWdMRXNsWnBzbDVhZz09--00ab1b89ff4cf05c9f3f3ed71eec9c0c4557f032,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session
Verbose SSO log: Checking nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336
Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired

En el servidor Redis, sí veo la clave nonce

redis:6379[3]> KEYS "*NONCE*"
1) "default:3aa05452fdd8fd4a93481eb8afa90f3aSSO_NONCE_8199453c67e347124ecb2e57e5738336"
2) "default:21639ca4bef85f68c1d72824e3a49bd6SSO_NONCE_7d54c965762e6861799f62ef7c5cfa60"
3) "default:_CACHE:USED_SSO_NONCE_86886a948684ff110d4830919d4e6de5"
4) "default:_CACHE:USED_SSO_NONCE_d04fdbf483fe61129a6fcc54087cb4e4"
5) "default:f7c87c11539908b30f9e307ef05d3f18SSO_NONCE_90a6a6997b7bd5d75eac1ac0cfc6dee2"

Mi preocupación es que Session esté en blanco para /sso_login.

Pinging el tema, si alguien tiene alguna sugerencia.

¿El sitio es público por casualidad? Ayudaría si pudiéramos depurarlo en línea.

2 Me gusta

Sí, lo es, enviaré la dirección en un mensaje privado.

Actualización: enviado por mensaje privado

1 me gusta

¿El inicio de sesión falla para todos los usuarios al mismo tiempo? ¿O sucede en un momento diferente para cada usuario?

El hecho de que vuelva a funcionar después de un tiempo me hace preguntarme si hay alguna caché involucrada. ¿Su configuración de NGINX, o algún otro proxy intermedio (por ejemplo, Cloudflare), realiza algún tipo de caché?

Se interrumpe para todos los usuarios durante ese breve período. Mi primera suposición fue que un nodo intermedio estaba interfiriendo con los datos, pero cuando registré las cookies del controlador (como se explicó anteriormente), pude ver las cookies. ¿Hay algo más que deba verificar también?

Volviendo a mencionar el tema.

3 publicaciones se dividieron en un nuevo tema: Cliente WordPress DiscourseConnect - nonce caducado

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