Hola, estoy buscando obtener el grupo al que pertenece un usuario. Parece que debería poder obtener esta información mediante get_discourse_user, pero esta función no parece devolver ningún dato de grupo. Según esta publicación, ¿debería hacerlo?
¿Estás llamando a la función de WP Discourse get_discourse_user? De ser así, debería devolver los grupos del usuario en el array "groups".
Sí, lo estoy llamando así.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
Y esto es lo que devuelve:
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
El parámetro true en la llamada a la función hará que esta busque al usuario en Discourse por su dirección de correo electrónico si no se encuentra ningún usuario basado en el ID del usuario de WordPress. Esto significa que el usuario aún no ha iniciado sesión en Discourse mediante SSO. Cuando se encuentra un usuario por su dirección de correo electrónico, se devuelve menos información desde Discourse que cuando se encuentra un usuario basado en su ID de WordPress.
Es posible que la función pueda mejorarse para hacer que el valor de retorno sea más claro. Por ahora, si no hay un array groups en la respuesta, puedes saber que el usuario fue encontrado por su dirección de correo electrónico.
Entendido. ¡Gracias por la explicación, Simon!
Hola Simon,
He iniciado sesión en Discourse mediante SSO y veo este error al establecer el parámetro de correo electrónico en false.
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "No se pudo recuperar el usuario de Discourse." } } ["error_data"]=> array(0) { } }
Cuando se establece en True, aún no devuelve los grupos.
Estoy un poco confundido, ya que la configuración de SSO me inicia sesión en WordPress y Discourse (también puedo cerrar sesión en ambos desde WordPress), por lo que todo parece funcionar como se espera, pero aún no puedo ver los grupos devueltos.
Cuando estableces el segundo parámetro de la llamada a la función en false, o simplemente lo omites (su valor predeterminado es false), la función intentará recuperar al usuario de Discourse mediante su ID de WordPress. Si el usuario ha iniciado sesión en Discourse con SSO, la función debería devolver al usuario y sus grupos.
Para depurar esto, ve a la página de administración de Discourse del usuario que estás intentando recuperar. Desplázate hasta el final de la página y verifica si hay una sección de Single Sign On. Si la hay, asegúrate de que el External ID en esa sección coincida con el ID del usuario de WordPress que estás utilizando en la llamada a get_discourse_user.
Si no hay una sección de Single Sign On en la página de administración de Discourse del usuario, significa que este aún no ha iniciado sesión en Discourse con SSO.
Sí, no veo que esa sección exista para ninguno de los usuarios que he probado.
Realmente parece que estoy iniciando sesión mediante SSO, sin embargo.
Este es el flujo (sin iniciar sesión en WordPress ni en Discourse):
Desde WordPress, hago clic en el enlace Iniciar sesión con Discourse.
Me redirige al sitio de Discourse.
Ingreso mis credenciales de Discourse.
Soy redirigido correctamente de vuelta al sitio de WordPress.
Ahora estoy conectado en ambos sitios.
¿Qué me falta en el proceso para que sea oficialmente SSO?
Ahora veo el problema. Estás usando Discourse como proveedor de SSO para WordPress. Esa función está pensada para usarse cuando WordPress es el proveedor de SSO para Discourse. El nombre de la función es poco claro. Debería dejar evidente para qué caso de uso está diseñada.
En el caso en que Discourse sea el proveedor de SSO para WordPress, lo que necesitas es realizar una solicitud de API autenticada a /admin/users/$user_id.json. $user_id debe establecerse con el ID de usuario de Discourse. Para los usuarios que han iniciado sesión en WordPress a través de Discourse, puedes obtener su ID de usuario de Discourse con:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
¡Ah, vale! Empezaré a sumergirme en la documentación de tu API. ¡Gracias por indicarme la dirección correcta!