El array `groups` del objeto JS de usuario no se rellena para varios usuarios

Estoy usando el Objeto JS de Usuario de Discourse para verificar los grupos a los que pertenece el usuario actual.

Para algunos usuarios, la matriz groups en el Objeto JS del Usuario devuelve una matriz adecuada de objetos, cada uno describiendo un grupo del que este usuario es miembro. Ejemplo:

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
}

Sin embargo, para la mayoría de los usuarios, la matriz groups está simplemente vacía (0).
No puedo entender por qué podría ser así, ya que esos usuarios son miembros de grupos correctamente.
También verifiqué si está relacionado con el “grupo principal”, sin embargo, los usuarios que tienen una matriz groups tampoco están en ningún grupo principal, por lo que este no es el problema.

Estoy usando una Conexión SSO de WP para manejar los inicios de sesión de los usuarios, por lo que inician sesión en una instancia de WP, y la instancia de Discourse es básicamente una “esclava” de WP, lo que significa que Discourse extrae todos los datos del usuario de WP, y el inicio de sesión se maneja en WP.
Me aseguré de que el usuario “defectuoso” haya iniciado sesión correctamente al menos una vez en WP y haya ido a Discourse al menos una vez para que esté conectado, y puedo confirmar que el usuario se agrega a los grupos correctos - simplemente no es visible en la matriz groups en el Objeto JS del Usuario.

¿Alguien puede ayudarme a detectar por qué sucede esto y cómo puedo solucionarlo?
“Necesito desesperadamente” el grupo del que el usuario es miembro en esa matriz :slight_smile:

Por cierto, si es importante, así es como obtengo el Objeto JS del usuario actual: funciona bien hasta ahora, excepto por el problema de los grupos que afecta a algunos usuarios (la mayoría, en realidad).

$(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);// Esto devuelve vacío para muchos usuarios.
            console.log(result.current_user);// Todos los datos aquí están correctamente poblados para TODOS los usuarios, a menos que la matriz GROUPS.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

Estás usando el endpoint de sesión para el usuario actualmente conectado (es decir, session/current). Solo los miembros del personal obtendrán los grupos “automáticos” (por ejemplo, grupos de nivel de confianza) de ese endpoint.

Para un ejemplo de esto, consulta https://meta.discourse.org/g. No es el mismo endpoint, pero se aplica el mismo principio. Verás que no puedes ver todos los grupos de nivel de confianza en meta, porque no eres miembro del personal en este foro.

Necesitarás usar una solicitud autenticada, es decir, con una clave API, para obtener todos los grupos de un usuario, incluidos los grupos automáticos. Si este javascript se está ejecutando en Wordpress, puedes usar las funciones de utilidad de WP Discourse para hacerlo. Hará una solicitud utilizando la clave API que has proporcionado en la interfaz de administración.

2 Me gusta

¿En serio? No creo que deba ser tan complicado.


Esto es de await $.ajax("/u/Lhc_fl.json")
Obviamente no soy miembro del personal de Meta, pero puedo ver mis grupos “automáticos”.

2 Me gusta

@Llc_fl, entonces, lo que hiciste fue obtener el nombre de usuario del usuario actual (¿supongo que con el mismo AJAX que yo uso?), luego otro AJAX a ese JSON de usuario, y desde allí ¿al grupo?

También me gusta el enfoque de @angus: mi código está del lado de Discourse… ¿Podría simplemente usar la misma clave API y autenticarme con ella?
Había supuesto que, dado que uso withCredentials… el código solo se ejecuta cuando un usuario está autenticado, y que los datos siempre serían los mismos.

No estoy seguro de por qué los datos no son los mismos, ¿es una preocupación de seguridad comunicar en qué grupo está un usuario? No es que comuniquemos los datos reales del grupo, u otros usuarios en ese grupo, por lo que veo.

En cualquier caso, me estoy adentrando en los enfoques sugeridos ahora…

¡Gracias!

Si estás desarrollando componentes para discourse… Creo que la forma más fácil es usar la API de discourse. Si estás desarrollando un cliente, ¿no crees que el nombre de usuario debería haber sido conocido hace mucho tiempo?

Para lo primero, aquí tienes un ejemplo;

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

Deberías poder acceder al objeto del usuario actual y eso te mostrará a qué grupos sabe que pertenece el usuario. Ya está cargado para cada usuario, por lo que accederás a la API del plugin como cualquier otro tema que mire al usuario actual. Hay ejemplos que puedes consultar en la Guía de referencia rápida para desarrolladores de temas y buscar.

Este tema, que es un tema recomendado para este, tiene un ejemplo: currentUser.groups doesn't match group_users table

1 me gusta

Gracias a todos

Si bien en esta instancia en particular groups todavía permanece vacío (incluso con la API del usuario en lugar de la sesión actual), pude lograr esto verificando el ID del grupo en group_users, que también almacena los mismos datos, solo que sin el nombre.

Utilicé mi enfoque original para obtener los datos, ya que esto es “solo” un fragmento agregado en Discourse como un script de head, sin tema ni plugin.
No pude hacer que la api real funcionara, pero el enfoque AJAX funciona igual de bien para lo que necesitaba.

Gracias de nuevo a todos por sus aportes, especialmente a @Lhc_fl, cuyo enfoque me llevó a la solución correcta para mi caso.

2 Me gusta

Este tema se cerró automáticamente después de 11 días. Ya no se permiten nuevas respuestas.