WordPress SSO y inicio de sesión de Patreon

¡Hola de nuevo! Tenía una pregunta. Un cliente mío quiere migrar gradualmente su membresía de Patreon a WordPress (a través de Woocommerce Memberships). Sé que esto es posible basándome en otros posts del foro.

Sin embargo, mi pregunta es: si habilitamos SSO con WordPress como proveedor, ¿es WordPress la ÚNICA forma de iniciar sesión en los foros? ¿Habilitar SSO con WordPress dejaría de permitir que los usuarios de Patreon inicien sesión con sus cuentas de Patreon? ¿O es posible tener ambos funcionando simultáneamente?

Disculpa si esto resulta confuso o si este no es el lugar adecuado para hacer esta pregunta.

¡Gracias de antemano!

Sí, la primera S de SSO es Single. WordPress se convierte en la autoridad para toda la autenticación.

Dicho esto, si Patreon proporciona las direcciones de correo electrónico de los usuarios, estos pueden registrarse en WordPress para recuperar el acceso a sus cuentas, siempre que utilicen la misma dirección.

También podrías permitir que los usuarios inicien sesión en tu sitio de WordPress mediante Patreon con Patreon WordPress – WordPress plugin | WordPress.org. No lo he probado, pero debería ser posible permitir el inicio de sesión en WordPress a través de Patreon manteniendo al mismo tiempo el inicio de sesión único (SSO) entre WordPress y Discourse. Si lo intentas y tienes problemas para que funcione, háznoslo saber.

¡Hola! He probado esta configuración y básicamente funciona. :slight_smile:
El único problema que encontré es que no redirige a Discourse después de iniciar sesión correctamente; devuelve al usuario a WordPress. El usuario tiene que ir manualmente a Discourse y luego hacer clic nuevamente en el botón “Iniciar sesión” para registrarse. Me pregunto si esto se puede solucionar de alguna manera.

He grabado un video para mostrar cómo funciona:

Gracias por probarlo. Parece que los parámetros SSO necesarios para iniciar sesión en Discourse se eliminan durante el proceso de inicio de sesión en Patreon. Si ese es el caso, probablemente no haya nada que se pueda hacer para solucionar el problema.

Me pregunto si esto se puede solucionar modificando el plugin Wordpress-Patreon. ¿Vale la pena contactar a sus autores? :slight_smile:

Si la causa del problema es lo que creo, entonces modificar el plugin de WordPress para Patreon podría solucionarlo. Lo que creo que está causando el problema es que el plugin de WordPress para Patreon está eliminando los parámetros de consulta sso y sig que se envían con la solicitud de inicio de sesión de Patreon. Podría valer la pena contactar a los desarrolladores de ese plugin sobre este problema.

Antes de hacerlo, deberías confirmar que al hacer clic en el botón Iniciar sesión en Discourse, para un usuario que actualmente no ha iniciado sesión en WordPress, este sea redirigido a la página de inicio de sesión de WordPress. Si el usuario luego selecciona la opción de iniciar sesión con Patreon, iniciará sesión en WordPress pero no en Discourse. Ten en cuenta que si tu sitio de Discourse está configurado como privado, lo anterior debería ocurrir si un usuario navega directamente a tu sitio de Discourse. En ese caso, el usuario no verá un botón de Iniciar sesión en Discourse.

¡Hola! He enviado un informe a los desarrolladores del plugin de Patreon: Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers

Sí, puedo confirmarlo:

  • hacer clic en el botón de Iniciar sesión en Discourse, para un usuario que no ha iniciado sesión actualmente en WordPress lleva al usuario a la página de inicio de sesión de WordPress - :white_check_mark:

  • Si el usuario luego selecciona la opción de inicio de sesión de Patreon, se inicia sesión en WordPress - :white_check_mark:

  • pero no se inicia sesión en Discourse - :white_check_mark: - en el video anterior en 0:32 se muestra que el usuario no ha iniciado sesión.

¡Bien! He encontrado una solución alternativa que “soluciona” el problema de inicio de sesión con Patreon. A continuación, encontrarás las instrucciones. :slight_smile:

Necesitarás:

  • Cualquier plugin que proporcione un shortcode para mostrar un formulario de inicio de sesión (yo tengo WooCommerce instalado en mi sitio, así que usé el shortcode [woocommerce_my_account], que hace exactamente esto para usuarios no iniciados).
  • El plugin Members, que proporciona los shortcodes [members_logged_in] y [members_not_logged_in] para ocultar/mostrar contenido según si el usuario ha iniciado sesión o no. Puedes usar cualquier otro plugin que ofrezca una funcionalidad de shortcodes similar.
  • El plugin Shortcode Redirect.

La idea es crear una página especial que muestre un formulario de inicio de sesión (y el botón de inicio de sesión de Patreon) para usuarios no iniciados. Y si el usuario ya ha iniciado sesión, debe redirigir a la URL https://community.morevnaproject.org/session/sso?return_path=%2F.
(Obviamente, deberás reemplazar “community.morevnaproject.org” con tu propio dominio).

Mi página especial de inicio de sesión tiene el siguiente contenido:

[members_not_logged_in]
   [woocommerce_my_account]
   [patreon_login_button]
[/members_not_logged_in]
[members_logged_in]
   [redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']
[/members_logged_in]

(puedes verlo en acción aquí: Log In / Register – Morevna Project)

Luego, todo lo que necesitas es configurar el plugin WP-Discourse para usar esa página en el SSO:

Cuando el usuario hace clic en el botón “Iniciar sesión” en Discourse, es redirigido a mi página especial de WordPress. Como el usuario no ha iniciado sesión, se muestra el formulario de acceso. Si el usuario hace clic en el botón “Iniciar sesión con Patreon”, es redirigido a Patreon para la autorización. Tras una autorización exitosa, es redirigido de nuevo a mi página especial. Dado que el usuario ya ha iniciado sesión, se activa el shortcode “redirect”:

[redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']

…y el usuario es redirigido con éxito de nuevo a los foros de Discourse.

La parte session/sso?return_path=%2F al final de la URL es necesaria; de lo contrario, Discourse no reconocerá al usuario como iniciado sesión después de la redirección.

¡Eso es todo! Espero que esto ayude a otros usuarios que deseen tener SSO con WordPress e inicio de sesión con Patreon en su sitio web. :slight_smile:

¡Buen trabajo al averiguar eso :+1:

No quiero restar valor al trabajo que has realizado, pero mi primera impresión es que deberías considerar utilizar un servicio de autenticación externo (como okta.com o auth0.com) en este punto. Siempre que llegues al punto de conectar tres servicios diferentes (por ejemplo, Patreon, WordPress y Discourse) para lograr una única autenticación de una sola vez, es una señal de que deberías estar considerando una solución de autenticación dedicada. Independientemente de si puedes lograrlo de alguna manera, existe un riesgo considerable a largo plazo de que tu solución falle o no funcione en todos los casos.

Si aún deseas seguir por este camino, tengo algunas sugerencias, pero advierto que esto se volverá un poco técnico. Estoy agregando esto en parte por si alguien más se encuentra con esto y quiere llevarlo más lejos.

Eché un vistazo rápido al código del plugin de Patreon para WordPress y parece que su flujo de OAuth acepta una clave/valor final_redirect_uri en el parámetro state, lo que te permitiría pasar directamente de la autenticación de Patreon al SSO de Discourse, eliminando la necesidad de los plugins Members y Redirect mencionados anteriormente y evitando cualquier problema que pueda surgir con ese enfoque.

Muchos servicios de autenticación tienen una versión del parámetro final_redirect_uri, es decir, un parámetro que te permitirá cambiar el destino al que se envía al usuario después de la autenticación. Si estás leyendo esto porque estás intentando resolver el mismo problema, pero con un servicio diferente (es decir, otro que no sea Patreon), y también has decidido que mi advertencia sobre conectar tres servicios diferentes no aplica, entonces ahí es donde deberías buscar.

Esto significa que querrías que el shortcode que genera el botón de inicio de sesión de Patreon acepte un final_redirect_uri como argumento, el cual luego se pasaría a la URL de inicio de sesión utilizada finalmente por Patreon. Al observar el código del plugin de Patreon para WordPress, esto es una posibilidad viable. Para darte una idea, la función relevante que genera la URL de Patreon se ve así:

Patreon_Frontend::patreonMakeLoginLink(false, array( 'final_redirect_uri' => # ) );

Básicamente, el código ya está parcialmente configurado para manejar un final_redirect_uri personalizado. Puedo entender por qué los desarrolladores del plugin de Patreon para WordPress podrían no querer agregarlo, pero si sientes que tienes suficiente confianza para describir lo que he explicado aquí, podría valer la pena crear un problema en su repositorio de GitHub. Si eso no funciona, puedes usar la función que he mencionado anteriormente para generar un enlace tú mismo y crear tu propio botón (o contratar a un desarrollador de WordPress para que lo haga).

Solo una nota menor sobre la construcción de la URL de SSO: es un poco más claro usar

https://discourse.example.com/session/sso?return_path=/

en lugar de

https://discourse.example.com/session/sso?return_path=%2F

Esa última parte, el return_path, es la ruta a la que se envía al usuario en Discourse después del inicio de sesión. Si es /, se le enviará a la página principal del foro. Para más información sobre la construcción de la URL de SSO, consulta Consejos y trucos de WP Discourse.

+1 sí, ¡hay un riesgo! :slight_smile:

¡Guau, muchas gracias por las instrucciones detalladas! Tiene sentido entonces modificar el shortcode [patreon_login_button] para que acepte el parámetro final_redirect_uri y hacer una PR a su repositorio de GitHub. ¡Gracias de nuevo por tomarte el tiempo de explicarlo!