Cuando configuré SSO por primera vez con WordPress, los usuarios iban a la URL del foro, eran redirigidos a la página de inicio de sesión de WordPress y, tras iniciar sesión, volvían a ser redirigidos al foro.
Sin embargo, en algún momento esto cambió y no tengo idea de cómo. Ahora, después de iniciar sesión en WordPress, el usuario es redirigido al panel de control de WordPress.
Además, otra cosa extraña es que, cuando cierro sesión en Discourse, veo un mensaje que dice “Has cerrado sesión”, pero al hacer clic en el botón “Actualizar”, en realidad no se cierra la sesión. Todavía puedo publicar, responder, etc. A veces tengo que cerrar sesión dos o tres veces hasta que realmente se cierra la sesión. Así que funciona, pero no de manera consistente.
¿Alguna idea sobre cómo puedo solucionar estos problemas?
Probablemente haya un plugin de WordPress que interfiera con tus rutas y/o se conecte a tus funciones de inicio de sesión. Simplemente desactiva la mitad de tus plugins de WordPress y observa cuál de las dos mitades causa el problema, luego desactiva la mitad de los plugins de ese grupo, y así sucesivamente.
Comienza con los plugins relacionados con la autenticación, las membresías y el inicio de sesión.
La respuesta de Michael probablemente sea correcta. Además, ¿tienes instalado el plugin Woocommerce en tu sitio? Si es así, hay un código que puedes agregar a tu sitio para solucionar el problema.
El problema de cierre de sesión puede estar relacionado con el problema de redirección al iniciar sesión. Si desactivar los plugins no resuelve el problema, avísanos.
El problema de inicio de sesión parece ser un conflicto con el plugin MemberPress. Así que supongo que tendré que investigar una posible solución con ellos.
El problema de cierre de sesión fue causado por un plugin de redirección. Había una redirección a la página de inicio que estaba causando el problema con el cierre de sesión de Discourse.
Michael – realmente aprecio tu ayuda y tus consejos sobre los plugins que podrían ser sospechosos. Me ahorraste un montón de tiempo porque esos fueron los dos primeros plugins que revisé.
Simon – gracias por decirme sobre el plugin WordPress Health Check. No lo había oído hablar antes, pero lo voy a instalar ahora y lo usaré para solucionar problemas en el futuro.
Revisa la configuración del complemento en busca de redirecciones de inicio de sesión que pueda crear. Parece que está redirigiendo a los usuarios a su página de perfil antes de que el complemento WP Discourse pueda redirigirlos de vuelta a Discourse. Si encuentras la solución, por favor publícala aquí. Si no la encuentras, avísanos. Puedo intentar instalar MemberPress en mi sitio local.
Sí, el complemento Health Check es excelente para depurar este tipo de problemas.
No he logrado avanzar con MemberPress para resolver esto. Definitivamente es un conflicto con MemberPress, ya que es el único plugin donde he establecido una URL de redirección específica, es decir, /jump.
Realmente no sé cuál es el siguiente paso. Cuando alguien inicia sesión en mi sitio de WordPress, quiero redirigir a esas personas a /jump después del inicio de sesión. Así que MemberPress está cumpliendo su función allí.
Pero cuando las personas acceden a mi sitio de Discourse, por ejemplo, community.mydomain.com, son redirigidas a la página de inicio de sesión de WordPress, pero después de iniciar sesión también son enviadas a /jump en lugar de ser redirigidas de vuelta al foro.
¿Sabes qué configuraciones has habilitado en MemberPress para crear la redirección? Tengo una versión reciente de MemberPress instalada en mi sitio de desarrollo, pero no he podido replicar ni el problema de inicio de sesión ni el problema por el cual los usuarios no cierran sesión en Discourse.
¿Tu sitio de WordPress está en una instalación multisitio o es una instalación normal de WordPress?
Es posible que el problema que observas con los usuarios que no cierran sesión en Discourse se deba a que tu sitio de Discourse está configurado para requerir inicio de sesión para ver el contenido. En este caso, al actualizar la página de Discourse se iniciará el inicio de sesión SSO. Para cerrar completamente la sesión de los usuarios en Discourse, también debes cerrar su sesión en WordPress. Esto se puede hacer ingresando https://example.com/?request=logout en la configuración del sitio logout redirect de Discourse. Reemplaza example.com con el dominio de tu sitio de WordPress. Avísame si has hecho esto y sigue sin funcionar.
Es una instalación normal de WordPress (no multisitio). Y el cierre de sesión ya se ha solucionado.
El problema está en la redirección después del inicio de sesión; es decir, los usuarios no son redirigidos de nuevo al sitio de Discourse tras iniciar sesión en WP. En su lugar, parece que MemberPress los está enviando a una página predeterminada de WordPress.
¿Sabes si has configurado la página a la que se redirige a los usuarios en las opciones de MemberPress? De ser así, ¿qué opción configuraste para esto?
El problema está ocurriendo en la función track_and_override_login_redirect_mepr. Dicha función se conecta mediante el filtro mepr-process-login-redirect-url de MemberPress. Es posible conectar con esta función y sobrescribirla verificando la consulta que se haya establecido. Esto se puede hacer con la función wp_get_referer().
No creo que tenga tiempo para resolver esto hoy, pero volveré a revisarlo en los próximos días.
Lo volví a revisar mientras estaba fresco en mi memoria. Agregar la siguiente función al archivo functions.php de mi tema resolvió el problema para mí, aunque no ha sido probado en exceso.
La función se conecta al filtro 'mepr-process-login-redirect-url' antes de que MemberPress lo haga. Luego verifica el valor de los parámetros de consulta para determinar si la solicitud fue iniciada por una petición SSO desde Discourse. Si fue así, redirige al usuario a la página de inicio de WordPress manteniendo los parámetros de consulta intactos. Esto hará que el plugin WP Discourse complete la solicitud SSO. Creo que esto aún puede funcionar si tu página de inicio está protegida por MemberPress, pero sería bueno confirmarlo.
Si la solicitud no fue iniciada por Discourse, se llama al método estático MeprProductsCtrl::track_and_override_login_redirect_mepr con los argumentos que se pasaron al filtro.
Soy un poco reacio a recomendar agregar este código a tu sitio en producción. Si decides probarlo, asegúrate de poder eliminar el código de tu servidor en caso de que rompa tu sitio. Asegúrate también de probarlo con tantos niveles de usuarios/membresías como sea posible.
¡Esto es GENIAL, Simon! ¡Eres una estrella del rock!
También me siento reacio a añadir esto a mi sitio de producción de inmediato. Creo que tendré que configurar un sitio de pruebas para hacerlo correctamente.