Le tableau JS Object `groups` de l'utilisateur n'est pas renseigné pour plusieurs utilisateurs

J’utilise l’objet JavaScript Utilisateur de Discourse pour vérifier les groupes dont l’utilisateur actuel fait partie.

Pour certains utilisateurs, le tableau groups dans l’objet JavaScript de l’utilisateur renvoie un tableau d’objets approprié, décrivant chacun un groupe dont cet utilisateur fait partie. Exemple :

groups: Array (5)
0 {
  id: 1,
  name: "admins",
  has_messages: false
}
1 {
  id: 46,
  name: "custom-group",
  has_messages: false
}
2 {
  id: 3,
  name: "staff",
  has_messages: false
}
3 {
  id: 10,
  name: "trust_level_0",
  has_messages: false
}
4 {
  id: 11,
  name: "trust_level_1",
  has_messages: false
}

Cependant, pour la plupart des utilisateurs, le tableau groups est simplement vide (0).
Je n’arrive pas à comprendre pourquoi cela se produit, car ces utilisateurs font bien partie de groupes.
J’ai également vérifié si cela était lié au « groupe principal », cependant, les utilisateurs qui ont un tableau groups ne font pas non plus partie d’un groupe principal, donc ce n’est pas le problème.

J’utilise une connexion SSO WP pour gérer les connexions des utilisateurs, donc ils se connectent sur une instance WP, et l’instance Discourse est essentiellement une « esclave » de WP, ce qui signifie que Discourse récupère toutes les données utilisateur de WP, et la connexion est gérée dans WP.
J’ai veillé à ce que l’utilisateur « défectueux » se soit correctement connecté au moins une fois sur WP et soit allé au moins une fois sur Discourse pour qu’il soit connecté, et je peux confirmer que l’utilisateur est ajouté aux bons groupes - il n’est tout simplement pas visible dans le tableau groups de l’objet JavaScript de l’utilisateur.

Quelqu’un peut-il m’aider à identifier pourquoi cela se produit et comment je peux le corriger ?
J’ai « désespérément » besoin du groupe dont l’utilisateur fait partie dans ce tableau :slight_smile:

Au fait, si cela est important, voici comment je récupère l’objet JavaScript de l’utilisateur actuel - cela fonctionne très bien jusqu’à présent, sauf pour le problème des groupes qui affecte certains utilisateurs (la plupart, en fait).

$(document).ready(function() {
    $.ajax({
        type: 'GET',
        cache: false,
        url: 'https://discourse.domain.tld/session/current.json',
        dataType: 'json',
        xhrFields: {
            'withCredentials': true
        },
        success: function(result){
            var current_user_groups = result.current_user.groups;
            console.log(current_user_groups);// Ceci renvoie vide pour de nombreux utilisateurs.
            console.log(result.current_user);// Toutes les données ici sont correctement remplies pour TOUS les utilisateurs, sauf le tableau GROUPS.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

Vous utilisez le point de terminaison de session pour l’utilisateur actuellement connecté (c’est-à-dire session/current). Seuls les membres du personnel obtiendront les groupes « automatiques » (par exemple, les groupes de niveau de confiance) de ce point de terminaison.

Pour un exemple, consultez https://meta.discourse.org/g. Ce n’est pas le même point de terminaison, mais le même principe s’applique. Vous verrez que vous ne pouvez pas voir tous les groupes de niveaux de confiance sur meta, car vous n’êtes pas un membre du personnel sur ce forum.

Vous devrez utiliser une requête authentifiée, c’est-à-dire avec une clé API, pour obtenir tous les groupes d’un utilisateur, y compris les groupes automatiques. Si ce code JavaScript s’exécute sur Wordpress, vous pouvez utiliser les fonctions utilitaires WP Discourse pour ce faire. Il effectuera une requête en utilisant la clé API que vous avez fournie dans l’interface d’administration.

2 « J'aime »

Vraiment ? Je ne pense pas que ce devrait être si compliqué ?


Ceci provient de await $.ajax("/u/Lhc_fl.json")
Je ne suis évidemment pas un membre du personnel de Meta, mais je peux voir mes groupes « automatiques »

2 « J'aime »

@Lhc_fl, donc ce que vous avez fait, c’est récupérer le nom d’utilisateur de l’utilisateur actuel (je suppose avec le même AJAX que moi ?), puis un autre AJAX vers ce JSON d’utilisateur, et à partir de là le groupe ?

J’aime aussi l’approche de @angus - mon code est cependant du côté de Discourse… Je pourrais simplement utiliser la même clé API et m’authentifier avec celle-ci ?
J’avais supposé que, puisque j’utilise withCredentials… le code ne s’exécute que lorsqu’un utilisateur est authentifié, et que les données seraient toujours les mêmes.

Je ne suis pas sûr pourquoi les données ne sont pas les mêmes, est-ce une préoccupation de sécurité de communiquer quel groupe un utilisateur est dans ? Ce n’est pas que nous communiquons les données réelles du groupe, ou d’autres utilisateurs dans ce groupe, autant que je puisse voir.

Dans tous les cas, je me lance maintenant dans les approches suggérées…

Merci !

Si vous développez des composants pour Discourse… Je pense que le moyen le plus simple est d’utiliser l’API de Discourse. Si vous développez un client, je pense que le nom d’utilisateur aurait dû être connu depuis longtemps ?

Pour le premier cas, voici un exemple ;

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api) => {console.log(api.currentUser())});
2 « J'aime »

Vous devriez pouvoir accéder à l’objet utilisateur actuel et cela vous montrera les groupes dont l’utilisateur sait qu’il en est membre. Il est déjà chargé pour chaque utilisateur, vous accéderez donc à l’API du plugin comme tout autre thème qui examine l’utilisateur actuel. Il existe des exemples dans le Guide de référence rapide pour les développeurs de thèmes et vous pouvez y jeter un coup d’œil.

Ce sujet, qui est un sujet recommandé pour celui-ci, contient un exemple : currentUser.groups doesn't match group_users table

1 « J'aime »

Merci à tous

Bien que dans cette instance particulière, groups reste vide (même avec l’API de l’utilisateur au lieu de la session actuelle), j’ai pu y parvenir en vérifiant l’ID du groupe dans group_users qui stocke également les mêmes données, juste pas avec le nom.

J’ai utilisé mon approche initiale pour obtenir les données car il s’agit « juste » d’un extrait ajouté dans Discourse comme script head, sans thème ni plugin.
Je n’ai pas pu faire fonctionner l’api réelle, mais l’approche AJAX fonctionne tout aussi bien pour ce dont j’avais besoin.

Merci encore à tous pour vos contributions, en particulier à @Lhc_fl dont l’approche m’a conduit à la bonne solution pour mon cas.

2 « J'aime »

Ce sujet a été automatiquement fermé après 11 jours. Les nouvelles réponses ne sont plus autorisées.