L'array JS Object `groups` dell'utente non viene popolato per diversi utenti

Sto usando l’oggetto JS Utente di Discourse per verificare i gruppi di cui l’utente corrente fa parte.

Per alcuni utenti, l’array groups nell’oggetto JS Utente restituisce un array corretto di oggetti, ognuno dei quali descrive un gruppo di cui l’utente fa parte. Esempio:

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
}

Tuttavia, per la maggior parte degli utenti, l’array groups è semplicemente vuoto (0).
Non riesco a capire perché questo accada, dato che quegli utenti sono correttamente membri di gruppi.
Ho anche verificato se fosse correlato al “gruppo primario”, tuttavia, gli utenti che hanno un array groups non sono neanche in alcun gruppo primario, quindi questo non è il problema.

Sto usando una connessione SSO di WP per gestire gli accessi degli utenti, quindi accedono a un’istanza WP e l’istanza Discourse è fondamentalmente una “schiava” di WP, il che significa che Discourse estrae tutti i dati dell’utente da WP e l’accesso viene gestito in WP.
Mi sono assicurato che l’utente “difettoso” abbia effettuato correttamente l’accesso almeno una volta in WP e sia andato almeno una volta su Discourse in modo che sia loggato, e posso confermare che l’utente viene aggiunto ai gruppi giusti - semplicemente non è visibile nell’array groups nell’oggetto JS Utente.

Qualcuno può aiutarmi a capire perché succede e come posso risolverlo?
Ho “disperatamente” bisogno del gruppo di cui l’utente è membro in quell’array :slight_smile:

A proposito, se è importante, ecco come recupero l’oggetto JS Utente corrente - funziona benissimo finora, a meno che il problema dei gruppi che colpisce alcuni utenti (la maggior parte, in realtà).

$(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);// Questo restituisce vuoto per molti utenti.
            console.log(result.current_user);// Tutti i dati qui sono correttamente popolati per TUTTI gli utenti, tranne l'array GROUPS.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

Stai usando l’endpoint della sessione per l’utente attualmente connesso (cioè session/current). Solo i membri dello staff otterranno i gruppi “automatici” (ad esempio, i gruppi di livello di fiducia) da quell’endpoint.

Per un esempio, dai un’occhiata a https://meta.discourse.org/g. Non è lo stesso endpoint, ma si applica lo stesso principio. Vedrai che non puoi vedere tutti i gruppi di livello di fiducia su meta, perché non sei un membro dello staff su questo forum.

Dovrai utilizzare una richiesta autenticata, cioè con una chiave API, per ottenere tutti i gruppi di un utente, inclusi i gruppi automatici. Se questo javascript viene eseguito su Wordpress, puoi utilizzare le funzioni di utilità di WP Discourse per farlo. Effettuerà una richiesta utilizzando la chiave API che hai fornito nell’interfaccia di amministrazione.

2 Mi Piace

Davvero? Non penso che dovrebbe essere così complicato?


Questo proviene da await $.ajax("/u/Lhc_fl.json")
Ovviamente non sono un membro dello staff di Meta, ma posso vedere i miei gruppi “automatici”

2 Mi Piace

@Lhc_fl, quindi quello che hai fatto è stato ottenere il nome utente dell’utente corrente (suppongo con lo stesso AJAX che uso io?), poi un altro AJAX a quel JSON utente, e da lì il gruppo?

Mi piace anche l’approccio di @angus - il mio codice però è sul lato discourse… Potrei semplicemente usare la stessa API key e autenticarmi con quella?
Avevo presunto che, dato che uso withCredentials… il codice viene eseguito solo quando un utente è autenticato, e che i dati sarebbero sempre gli stessi.

Non sono sicuro del perché i dati non siano gli stessi, è una preoccupazione di sicurezza comunicare in quale gruppo si trova un utente? Non è che comunichiamo i dati effettivi del gruppo, o altri utenti in quel gruppo, per quanto vedo.

In ogni caso, mi sto avventurando negli approcci suggeriti ora…

Grazie!

Se stai sviluppando componenti per discourse… Penso che il modo più semplice sia usare l’API di discourse. Se stai sviluppando un client, penso che il nome utente avrebbe dovuto essere conosciuto molto tempo fa?

Per il primo, ecco un esempio;

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api)=>{console.log(api.currentUser())});
2 Mi Piace

Dovresti essere in grado di accedere all’oggetto utente corrente e questo ti mostrerà a quali gruppi l’utente sa di appartenere. È già caricato per ogni utente, quindi accederai all’API del plugin come qualsiasi altro tema che esamina l’utente corrente. Ci sono esempi che puoi trovare nella Guida rapida per sviluppatori di temi e dare un’occhiata in giro.

Questo argomento, che è un argomento consigliato per questo, ha un esempio: currentUser.groups doesn't match group_users table

1 Mi Piace

Grazie a tutti

Mentre in questa particolare istanza groups rimane ancora vuoto (anche con l’API dell’utente invece della sessione corrente), sono riuscito a raggiungere questo obiettivo controllando l’ID del gruppo in group_users che memorizza gli stessi dati, solo che non con il nome.

Ho usato il mio approccio originale per ottenere i dati poiché questo è “solo” uno snippet aggiunto in Discourse come script head, nessun tema o plugin.
Non sono riuscito a far funzionare l’api effettiva, ma l’approccio AJAX funziona altrettanto bene per quello di cui avevo bisogno.

Grazie ancora a tutti per gli input, specialmente a @Lhc_fl il cui approccio mi ha portato alla soluzione giusta per il mio caso.

2 Mi Piace

Questo argomento è stato chiuso automaticamente dopo 11 giorni. Non sono più consentite nuove risposte.