Obter grupo do Discourse ao qual o usuário está associado

Olá, estou tentando obter o grupo ao qual um usuário pertence. Parece que deveria conseguir essas informações por meio de get_discourse_user, mas essa função não parece retornar nenhum dado de grupo. Segundo este post, deveria?

Você está chamando a função get_discourse_user do WP Discourse? Se sim, ela deve retornar os grupos do usuário no array "groups".

Sim, estou chamando assim.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);

E ele retorna isso

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

O parâmetro true na chamada da função fará com que ela procure o usuário no Discourse pelo endereço de e-mail caso nenhum usuário seja encontrado com base no ID do usuário do WordPress. Isso significa que o usuário ainda não fez login no Discourse usando SSO. Quando um usuário é encontrado pelo e-mail, menos informações são retornadas pelo Discourse do que quando o usuário é encontrado com base no ID do WordPress.

É possível que a função possa ser melhorada para tornar o valor de retorno mais claro. Por enquanto, se não houver um array groups na resposta, você pode saber que o usuário foi encontrado pelo e-mail.

Entendido. Obrigado pela explicação, Simon!

Oi Simon,

Fiz login no Discourse via SSO e estou recebendo esse erro ao definir o parâmetro de e-mail como false.

object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "The Discourse user could not be retrieved." } } ["error_data"]=> array(0) { } }

Quando definido como True, ainda não está retornando os grupos.

Estou um pouco confuso, pois a configuração do SSO me loga no WordPress e no Discourse (também consigo fazer logout de ambos via WordPress), então tudo parece estar funcionando conforme o esperado, mas ainda não consigo ver os grupos retornados.

Quando você define o segundo parâmetro da chamada da função como false ou simplesmente omite o parâmetro (o padrão é false), a função tentará recuperar o usuário do Discourse pelo seu ID do WordPress. Se o usuário tiver feito login no Discourse via SSO, a função deve retornar o usuário e seus grupos.

Para depurar isso, acesse a página de administração do usuário no Discourse que você está tentando recuperar. Role até o final da página e verifique se há uma seção de Single Sign On. Se houver, certifique-se de que o External ID nessa seção corresponda ao ID do usuário do WordPress que você está usando na chamada a get_discourse_user.

Se não houver uma seção de Single Sign On na página de administração do usuário no Discourse, significa que o usuário ainda não fez login no Discourse via SSO.

Sim, não estou vendo que essa seção exista para nenhum dos usuários que testei.

Realmente parece que estou fazendo login via SSO, no entanto.
Aqui está o fluxo. (não logado no Wordpress ou Discourse)

No Wordpress, clique no link Log in with Discourse
Ele me leva para o site do Discourse
Faço login com minhas credenciais do Discourse
Sou redirecionado com sucesso de volta para o site do Wordpress
Agora estou logado em ambos os sites

O que estou deixando de fora do processo para que seja oficialmente SSO?

Agora entendi o problema. Você está usando o Discourse como provedor de SSO para o WordPress. Essa função foi criada para ser usada quando o WordPress é o provedor de SSO para o Discourse. O nome da função é inadequado; deveria deixar claro qual é o caso de uso.

Para o caso em que o Discourse é o provedor de SSO para o WordPress, o que você precisa fazer é fazer uma requisição de API autenticada para /admin/users/$user_id.json. $user_id deve ser definido como o ID do usuário no Discourse. Para usuários que fizeram login no WordPress via Discourse, você pode obter o ID do usuário no Discourse com:

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

Ah, ok. Vou começar a me aprofundar na documentação da sua API. Obrigado por me indicar o caminho certo!