Estoy trabajando en un sitio web de WordPress que tiene un foro de Discourse conectado con aproximadamente 200.000 usuarios.
Usando los plugins OAuth Single Sign On - SSO (OAuth client) y WP-Discourse, conectamos las publicaciones de WP a Discourse y hacemos que los usuarios inicien sesión en WP con su instancia de usuario de WP, lo que luego también los inicia en Discourse.
Ahora, apareció un problema, cada vez que configuramos los ajustes de Discourse para que no requieran inicio de sesión.
Estos son nuestros pasos:
El usuario inicia sesión en WordPress
El usuario hace clic en un enlace que lleva a Discourse (un tema, cualquier enlace que lleve a Discourse)
==> ¡El usuario ahora ve Discourse como si no hubiera iniciado sesión! ¡Pero está iniciando sesión en el momento en que inició sesión en WordPress!
Ahora el usuario hace clic en el inicio de sesión de Discourse o en cualquier enlace de tema
¡La página se actualiza y el usuario ahora está autenticado!
Nos han dicho que esto es lo esperado y que debemos hacer lo siguiente:
cuando el usuario haya iniciado sesión, todos los enlaces que lleven a Discourse desde WordPress deben ser los siguientes: https://nuestra-instancia-discourse.com/session/sso?return_path={URL ORIGINAL DE DISCOURSE A LA QUE NOS DIRIGIMOS, como la URL de un tema, o similar}
cuando un usuario haya cerrado sesión, podemos enlazar directamente a {URL ORIGINAL DE DISCOURSE A LA QUE NOS DIRIGIMOS, como la URL de un tema, o similar}, así: https://nuestra-instancia-discourse.com/t/tema-slug
Sospecho firmemente que este es el enfoque incorrecto para resolver este problema, porque:
¿Qué pasa si un usuario, mientras tiene sesión iniciada en Discourse, copia la URL de un tema y la comparte con alguien que también tiene sesión iniciada en WP/DIscourse? Obtendrían el mismo error que se muestra arriba en el punto #2, ya que no se agregaría ningún sufijo de URL de este tipo.
¿Por qué un usuario con sesión iniciada necesita ser redirigido a session/sso?return_path=? ¿Cuál es el razonamiento técnico y la lógica detrás de esto?
¿Por qué se soluciona tan pronto como el usuario recarga la página (carga un tema, presiona iniciar sesión, etc.)?
¿Por qué no está esto más ampliamente documentado, si fuera el enfoque real esperado?
¿Por qué no se menciona esto en la API, donde podemos obtener cualquier URL de tema de Discourse, y en NINGUNA PARTE se indica que los usuarios con sesión iniciada no podrán acceder inmediatamente al contenido y primero necesitarán hacer recargas extrañas, o que necesitamos agregar parámetros de URL extraños que, de hecho, no convierten nada?
Realmente agradecería una opinión autorizada sobre esto, porque no estoy nada convencido de que este sea el comportamiento esperado.
Si lo es, me gustaría preguntar:
por qué esto es realmente necesario y
qué se planea hacer al respecto (porque esto ciertamente no es ideal, ver punto 1 de mis razones por las que esto no debería ser esperado)
Si quieres que tus usuarios sean redirigidos automáticamente al inicio de sesión cuando accedan a cualquier ruta de tu foro, deberás habilitar la configuración login required (inicio de sesión obligatorio). Este es, de hecho, el comportamiento esperado.
Aunque todavía se siente extraño, he agregado una redirección a session/sso?return_path= al iniciar sesión en el usuario en wp
La ruta de retorno que he establecido es el referente de wp (si lo hay) o la página de inicio de wp
Eso funciona muy bien y asegura que el usuario inicie sesión en ambas instancias
Tuve que habilitar la configuración en discourse para permitir “cualquier ruta de retorno”, ya que por defecto discourse no permite rutas de retorno “externas”
¿Ves algún problema al habilitar esta configuración?
¡Gracias de nuevo por la amable respuesta y la confirmación “oficial” más el enlace de documentación!
Normalmente aconsejo a los clientes que no hagan una redirección automática como esta. Entiendo por qué sientes que esto es un problema, es una sensación no poco común, sin embargo, el enfoque estándar funciona bien para muchos sitios tan grandes o más grandes que el tuyo y la redirección automática puede no funcionar en algunos escenarios, lo que lleva a una mala experiencia de usuario.
El inicio de sesión único que se inicia automáticamente en todas partes que esperas es cómo funcionan a veces los servicios interconectados como Meta (por ejemplo, inicia sesión en Facebook y ya has iniciado sesión en Instagram) porque son plataformas controladas centralmente (aunque incluso los servicios centralizados a veces funcionarán de la misma manera que DiscourseConnect).
En contraste, aquí estás tratando con marcos de software de código abierto independientes (es decir, Wordpress y Discourse). Se pueden configurar para que funcionen de manera efectiva de la forma que esperas, pero requiere un trabajo personalizado específico que tenga en cuenta tu caso de uso específico. Nunca será como funciona un sistema de autenticación como DiscourseConnect, que sirve a miles de casos de uso diferentes.
No, con la advertencia de que cuestionaría la premisa de necesitarlo. Pero sin más información, no veo ningún problema en usarlo.
¿Podría ser esto un riesgo de redirección no validado, como se describe aquí?
Puedo ver cómo “permitir cualquier valor de retorno” permite redirigir a cualquier parte.
Pero no estoy seguro de si esto realmente sería un riesgo, ya que no se comparten datos sensibles en o a esa URL de redirección.
Lo siento, eso sería desviarse hacia darte consejos sobre una parte delicada de tu configuración sin verla yo mismo, o sin tener una relación definida contigo.
Particularmente dado el tamaño de tu foro y las regulaciones pertinentes que se aplican a él, te recomendaría que obtengas asesoramiento específico e informado sobre esa pregunta.
Un foro de Discourse activa la configuración en Discourse para permitir “cualquier ruta de retorno”
Esto significa que ahora puedes visitar tu-discourse.tld/session/sso?return_path=CUALQUIER COSA
CUALQUIER COSA podría ser una URL externa
Por lo tanto, esto abre una vulnerabilidad de seguridad en términos de que al menos se podría escenificar un intento de phishing:
un sitio web malicioso crea un botón que dice “¡ve a la increíble comunidad!”
el enlace del botón es tu-discourse.tld/session/sso?return_path=VOLVER AL SITIO MALICIOSO
el usuario presiona el botón, inicia sesión en la comunidad, lo que lo devuelve al SITIO MALICIOSO
allí, el actor malicioso implementó una página que se ve exactamente como la comunidad y dice “algo salió mal mientras iniciabas sesión, por favor inténtalo de nuevo”
el usuario envía un formulario de inicio de sesión de aspecto agradable que coincide con la apariencia de la comunidad.
¿El actor malicioso ahora ha capturado los datos de inicio de sesión?
Por lo tanto, probablemente la configuración la configuración la configuración “cualquier ruta de retorno” nunca debería usarse para un sitio que tiene usuarios iniciando sesión, a menos que cada usuario sepa exactamente qué buscar.
¿Verías ese riesgo también?
¿Por qué los desarrolladores de Discourse que crean complementos/código que pueden interactuar con esta configuración no podrían dar una señal de “sí, no hay problema” o “infierno, no”?
No es que muchas cosas puedan cambiar en ese parámetro de URL. O está ahí o no, o permite externos o no.
Quizás estoy incursionando en un área en la que no debería, como en “no discutas problemas de seguridad aquí”. Lo entendería, por supuesto, muchas plataformas no permiten hablar abiertamente sobre posibles problemas de seguridad que no están claramente definidos al habilitarlos
Porque la valencia de las configuraciones depende de cómo se utilicen, de hecho, por eso son configuraciones y no solo “características”. Si hubiera una respuesta simple a tu pregunta, no habría una configuración en primer lugar.
Aprecio que esta respuesta, algo legalista, sea frustrante. Pero necesitas asesoramiento específico para tu caso de uso, que no estoy en posición de darte aquí.