Obtenir le groupe Discourse auquel l'utilisateur est associé

Bonjour, je cherche à récupérer les groupes auxquels un utilisateur appartient. Il semble que je devrais pouvoir obtenir ces informations via get_discourse_user, mais cette fonction ne semble pas renvoyer de données sur les groupes. Selon ce post, cela devrait être possible ?

Appelez-vous la fonction WP Discourse get_discourse_user ? Si oui, elle devrait retourner les groupes de l’utilisateur dans le tableau "groups".

Oui, je l’appelle comme ceci.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);

Et cela renvoie ceci

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) }

Le paramètre true dans l’appel de fonction permet de rechercher l’utilisateur sur Discourse par adresse e-mail si aucun utilisateur n’est trouvé en fonction de l’ID de l’utilisateur WordPress. Cela signifie que l’utilisateur ne s’est pas encore connecté à Discourse via SSO. Lorsqu’un utilisateur est trouvé par son adresse e-mail, moins d’informations sont renvoyées par Discourse que lorsqu’un utilisateur est trouvé par son ID WordPress.

Il serait peut-être possible d’améliorer la fonction pour rendre la valeur de retour plus claire. Pour l’instant, s’il n’y a pas de tableau groups dans la réponse, vous pouvez savoir que l’utilisateur a été trouvé par son adresse e-mail.

C’est noté. Merci pour l’explication, Simon !

Salut Simon,

Je me suis connecté à Discourse via SSO et je rencontre cette erreur lorsque je définis le paramètre email sur false.

object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "L'utilisateur Discourse n'a pas pu être récupéré." } } ["error_data"]=> array(0) { } }

Lorsque je le définis sur True, les groupes ne sont toujours pas renvoyés.

Je suis un peu perplexe car la configuration SSO me connecte bien à WordPress et à Discourse (je peux aussi me déconnecter des deux via WordPress), donc tout semble fonctionner comme prévu, mais je ne vois toujours pas les groupes renvoyés.

Lorsque vous définissez le deuxième paramètre de l’appel de fonction sur false, ou que vous omettez simplement ce paramètre (il est par défaut à false), la fonction tentera de récupérer l’utilisateur Discourse en fonction de son identifiant WordPress. Si l’utilisateur s’est connecté à Discourse via SSO, la fonction devrait renvoyer l’utilisateur ainsi que ses groupes.

Pour déboguer cela, accédez à la page d’administration Discourse de l’utilisateur que vous essayez de récupérer. Faites défiler la page jusqu’en bas et vérifiez s’il existe une section Single Sign On. Si c’est le cas, assurez-vous que l’External ID dans cette section correspond à l’identifiant de l’utilisateur WordPress que vous utilisez lors de l’appel à get_discourse_user.

S’il n’y a pas de section Single Sign On sur la page d’administration Discourse de l’utilisateur, cela signifie que l’utilisateur ne s’est pas encore connecté à Discourse via SSO.

Oui, je ne vois pas que cette section existe pour l’un des utilisateurs que j’ai testés.

Cependant, il semble vraiment que je me connecte via SSO.
Voici le flux. (non connecté à WordPress ou Discourse)

Depuis WordPress, je clique sur le lien Se connecter avec Discourse
Cela m’envoie vers le site Discourse
Je me connecte avec mes identifiants Discourse
Redirection réussie vers le site WordPress
Je suis maintenant connecté aux deux sites

Qu’est-ce qui me manque dans le processus pour que ce soit officiellement SSO ?

Je vois maintenant le problème. Vous utilisez Discourse comme fournisseur SSO pour WordPress. Cette fonction est conçue pour être utilisée lorsque WordPress est le fournisseur SSO pour Discourse. La fonction est mal nommée. Le nom devrait clairement indiquer le cas d’usage.

Dans le cas où Discourse est le fournisseur SSO pour WordPress, ce que vous devez faire est d’effectuer une requête API authentifiée vers /admin/users/$user_id.json. $user_id doit être défini sur l’ID Discourse de l’utilisateur. Pour les utilisateurs qui se sont connectés à WordPress via Discourse, vous pouvez obtenir leur ID utilisateur Discourse avec :

get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );

Ah, d’accord. Je vais commencer à plonger dans votre documentation API. Merci de m’avoir orienté dans la bonne direction !