Array de objetos JS do usuário `groups` não preenchido para vários usuários

Estou usando o Objeto JS do Usuário do Discourse para verificar os grupos do usuário atual em que eles “estão”.

Para alguns usuários, o array groups no Objeto JS do Usuário retorna um array adequado de objetos, cada um descrevendo um grupo do qual este usuário faz parte. Exemplo:

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
}

No entanto, para a maioria dos usuários, o array groups está simplesmente vazio (0).
Não consigo descobrir por que isso aconteceria, já que esses usuários são membros adequados de grupos.
Também verifiquei se está relacionado ao “grupo principal”, no entanto, os usuários que têm um array groups também não estão em nenhum grupo principal, então este não é o problema.

Estou usando uma Conexão SSO do WP para lidar com os logins dos usuários, então eles fazem login em uma Instância WP, e a instância do Discourse basicamente é uma “escrava” do WP, o que significa que o Discourse puxa todos os dados do usuário do WP, e o login é tratado no WP.
Certifiquei-me de que o usuário “defeituoso” fez login adequadamente pelo menos uma vez no WP e foi pelo menos uma vez ao Discourse para que ele esteja logado, e posso confirmar que o usuário é adicionado aos grupos corretos - apenas não está visível no array groups no Objeto JS do Usuário.

Alguém pode me ajudar a identificar por que isso acontece e como posso consertar?
Eu “desesperadamente” preciso do grupo do qual o usuário é membro nesse array :slight_smile:

Aliás, se for importante, é assim que eu busco o objeto JS do usuário atual - funciona bem até agora, exceto pelo problema dos grupos que afeta alguns usuários (a maioria, na verdade).

$(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);// Isso retorna vazio para muitos usuários.
            console.log(result.current_user);// Todos os dados aqui são preenchidos adequadamente para TODOS os usuários, exceto o array GROUPS.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

Você está usando o endpoint de sessão para o usuário atualmente logado (ou seja, session/current). Apenas membros da equipe receberão os grupos “automáticos” (por exemplo, grupos de nível de confiança) desse endpoint.

Para um exemplo disso, confira https://meta.discourse.org/g. Não é o mesmo endpoint, mas o mesmo princípio se aplica. Você verá que não pode ver todos os grupos de nível de confiança no meta, porque você não é um membro da equipe neste fórum.

Você precisará usar uma solicitação autenticada, ou seja, com uma chave de API, para obter todos os grupos de um usuário, incluindo grupos automáticos. Se este JavaScript estiver sendo executado no WordPress, você pode usar as funções utilitárias do WP Discourse para fazer isso. Ele fará uma solicitação usando a chave de API que você forneceu na interface de administração.

2 curtidas

Sério? Acho que não deveria ser tão complicado?


Isso é de await $.ajax("/u/Lhc_fl.json")
Obviamente, não sou um membro da equipe da Meta, mas posso ver meus grupos “automáticos”

2 curtidas

@Lhc_fl, então o que você fez foi obter o nome de usuário do usuário atual (suponho que com o mesmo AJAX que eu uso?), depois outro AJAX para aquele JSON de usuário, e de lá o grupo?

Eu também gosto da abordagem do @angus - meu código, no entanto, está no lado do discourse… Eu poderia simplesmente usar a mesma chave de API e autenticar com ela?
Eu presumi que, como uso withCredentials… o código só é executado quando um usuário está autenticado, e que os dados seriam sempre os mesmos.

Não tenho certeza por que os dados não são os mesmos, isso é uma preocupação de segurança comunicar qual grupo um usuário está? Não é que comunicamos os dados reais do grupo, ou outros usuários nesse grupo, pelo que vejo.

Em qualquer caso, estou entrando nas abordagens sugeridas agora…

Obrigado!

Se você estiver desenvolvendo componentes para o Discourse… Acho que a maneira mais fácil é usar a API do Discourse. Se você estiver desenvolvendo um cliente, acho que o nome de usuário já deveria ser conhecido há muito tempo?

Para o primeiro, aqui está um exemplo;

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

Você deve ser capaz de acessar o objeto do usuário atual e isso mostrará quais grupos o usuário sabe que é membro. Ele já está carregado para todos os usuários, então você acessará a API do plugin como qualquer outro tema que examine o usuário atual. Existem exemplos para você consultar no Guia de Referência Rápida para Desenvolvedores de Temas e dar uma olhada.

Este tópico, que é um tópico recomendado para este, tem um exemplo: currentUser.groups doesn't match group_users table

1 curtida

Obrigado a todos

Embora nesta instância específica o groups ainda permaneça vazio (mesmo com a API do usuário em vez da sessão atual), consegui alcançar isso verificando o ID do grupo em group_users, que também armazena os mesmos dados, apenas não com o nome.

Usei minha abordagem original para obter os dados, pois este é “apenas” um trecho adicionado ao Discourse como um script head, sem tema ou plugin.
Não consegui fazer a api real funcionar, mas a abordagem AJAX funciona perfeitamente para o que eu precisava.

Obrigado novamente a todos pelas contribuições, especialmente a @Lhc_fl, cuja abordagem me levou à solução correta para o meu caso.

2 curtidas

Este tópico foi fechado automaticamente após 11 dias. Novas respostas não são mais permitidas.