SSO roto después de la reconstrucción con stable v3.3.3

Después de una reconstrucción hoy con 3.3.3 (la última versión estable lanzada hace unos días), el SSO dejó de funcionar. Los usuarios que ya estaban conectados siguen funcionando por ahora, pero las nuevas sesiones terminan el flujo SSO con el error:

La conexión a la cuenta ha expirado, por favor intente conectarse de nuevo.

Habilitar el registro detallado de Discourse Connect muestra:

Registro SSO detallado: El nonce es incorrecto, fue generado en una sesión de navegador diferente o ha expirado.

Sin embargo, nada en nuestro flujo SSO ha cambiado en los últimos años. Los relojes entre los servidores están sincronizados.

Por otro lado, hemos actualizado muy recientemente a la versión 3.3.3 (desde la 3.3.2), que tiene correcciones de seguridad relacionadas con Discourse Connect que podrían estar relacionadas.

Poco probable que sea relevante, pero la reconstrucción fue para habilitar una CDN. Pero, ya he revertido todos esos cambios y el problema del SSO persiste.

¿Algún consejo sobre cómo depurar esto más a fondo?

1 me gusta

Después de varias reconstrucciones, pude volver a hacer que el SSO funcionara fijándolo de nuevo a la v3.3.2, por lo que parece que algo se introdujo en la v3.3.3 que rompió la compatibilidad con el SSO.

Eché un vistazo rápido a un git diff v3.3.2 v3.3.3 y nada obvio saltó a la vista, pero tiene cambios relacionados con Discourse Connect.

Sin embargo, sospecho que esto empezará a afectar a más gente a medida que pasen a la 3.3.3 y las sesiones de usuario empiecen a expirar y no se renueven. ¿Quizás valga la pena un examen más detenido por parte de alguien que conozca el código, especialmente el flujo de SSO? /cc @sam

PD: No estoy seguro de si puede ser relevante: había actualizado a la 3.3.3 hace más de un día, pero los problemas solo parecieron surgir poco después de una reconstrucción a través de la consola hace unas horas (para habilitar una CDN, pero revertir eso no solucionó el SSO).

1 me gusta

¿No es 3.3.3 un poco antiguo?

Sí, en el sentido de que la mayoría de la gente ejecuta la rama tests-passed, pero no en el sentido de que sea la última versión de la rama estable, lanzada esta semana: 3.3.3: Security and maintenance release

2 Me gusta

Es una posibilidad remota, pero ¿estás generando el nonce en una sesión de navegador diferente, por ejemplo, al realizar las solicitudes SSO desde el backend de tu aplicación, en lugar de hacer que los usuarios pasen por el proceso SSO utilizando redirecciones del navegador?

Hay una configuración oculta del sitio llamada discourse_connect_csrf_protection que está habilitada por defecto. Para permitir que las solicitudes SSO se realicen desde fuera de la sesión de un usuario, debe deshabilitarse.

Supongo que esa configuración estaba vigente en la versión 3.3.2, pero posiblemente se añadió más tarde.

1 me gusta

No es el caso: tenemos una implementación bastante estándar de lo que se describe en Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) siguiendo las redirecciones. Ha estado funcionando sin problemas durante algunos años y no lo hemos tocado.

Si bien no estamos haciendo nada inusual con el SSO, lo intenté de todos modos deshabilitándolo en la consola de Rails y todo lo que hizo fue eliminar el mensaje de error, en el sentido de que cuando el proveedor de SSO redirigía de vuelta a Discourse, en lugar del error La sesión de inicio de sesión de la cuenta ha expirado, por favor intente iniciar sesión de nuevo., no hubo ningún mensaje (ni de error ni de otro tipo), pero, lamentablemente, seguía cerrado la sesión.

También estoy buscando cualquier posible solución aquí, ya que esto es bastante extraño. Creo que el hecho de que el problema no apareciera cuando actualizamos inicialmente a 3.3.3 a través de la interfaz web, sino solo (~36h) más tarde después de una reconstrucción de la consola, podría ser una pista, pero no sé lo suficiente sobre las diferencias entre ambas.

He intentado actualizar de nuevo a 3.3.3 y el problema regresó inmediatamente. Volver a 3.3.2 hizo que el SSO volviera a funcionar.

2 Me gusta

Sospecho que el problema aquí no es la corrección de seguridad de DiscourseConnect, sino el cambio de nginx. En tests-passed tuvimos que hacer un seguimiento el jueves porque estaba causando problemas en algunos entornos y otro usuario en Github señaló problemas de CSRF.

Tengo un backport listo para eso: FIX: Simplify nginx config change (#30383) by pmusaraj · Pull Request #30410 · discourse/discourse · GitHub, debería fusionarse en breve (una vez que alguien del equipo lo apruebe, aunque es domingo para la mayoría de la gente). Puedes probar esa rama con tu configuración SSO @mentalstring.

4 Me gusta

¡Me complace informar que esto funcionó! :tada:

Agradezco que te hayas tomado el tiempo de investigar esto, especialmente un fin de semana y dado que tanto stable como SSO son un poco específicos, ¡pero espero que también ayude a otros! ¡Gracias!

Estaré atento a que se fusione el PR.

4 Me gusta