WordPress Multisite com múltiplas instâncias do Discourse

Olá a todos,

Estou buscando informações / viabilidade sobre a adição de outra comunidade Discourse à nossa configuração atual. No momento, temos uma configuração de WordPress multisite com uma comunidade Discourse usando o Discourse SSO para um site dedicado à comunidade Discourse, mas com outro provedor SSO alimentando o login do WP.

Estou procurando adicionar um novo site WP para uma nova comunidade Discourse, mas não tenho certeza se vários fóruns Discourse podem ser unidos dentro dessa configuração multisite (se faz sentido). Como o SSO é uma configuração de rede WP, parece que não é possível ter mais de uma instância do Discourse.

Idealmente, teríamos:

  • WordPress multisite
  • 2 instâncias do Discourse

(Os usuários entre ambas as instâncias do Discourse devem ter acesso apenas à comunidade à qual pertencem).

Li alguns posts sobre ter uma configuração multisite do WP com um Discourse de site único (e vice-versa), mas não encontrei nenhuma informação sobre multisite do WP e múltiplas instâncias do Discourse.

Obrigado

Não é possível que sites em uma configuração de WordPress multisite funcionem como provedor de SSO para duas instâncias do Discourse. O motivo é que, em uma rede multisite, todos os usuários são armazenados em uma única tabela de banco de dados. Se múltiplos sites do Discourse forem permitidos para funcionar como provedor de SSO para vários sites em uma rede, não há uma maneira direta de garantir que os IDs de usuário do Discourse salvos no WordPress sejam exclusivos.

Obrigado — é isso que eu estava imaginando. Seria possível permitir que uma instância do Discourse funcione como provedor de SSO para a outra instância, mantendo o acesso adequado dos usuários às suas respectivas comunidades?

Uma instância do Discourse pode funcionar como provedor de SSO para outra instância do Discourse. Estou assumindo que a configuração que você está considerando é ter o WordPress como provedor de SSO para a instância 1 do Discourse. A instância 1 do Discourse seria o provedor de SSO para a instância 2 do Discourse. Acredito que isso seja possível, mas nunca configurei um site do Discourse para ser simultaneamente um cliente de SSO e um provedor de SSO.

Com a configuração que descrevi acima, todos os usuários da instância 1 do Discourse teriam acesso à instância 2 do Discourse. Não creio que seja isso que você deseja.

Outra abordagem possível para o problema seria usar uma única instância do Discourse e utilizar permissões de grupo por categoria para limitar quais partes do fórum os usuários podem acessar. Você pode passar grupos do Discourse no payload de SSO. Deve ser possível no seu site WordPress determinar a quais sites um usuário tem acesso. Você pode criar um grupo do Discourse para cada site do WordPress e, em seguida, usar o filtro wpdc_sso_params para adicionar um parâmetro add_groups ao payload de SSO.

Atualmente, o SSO do Discourse é o provedor de SSO — acho que a nova consideração seria ter a Instância 1 como provedor de SSO (para as Instâncias 1 e 2).

Essencialmente, manter a mesma configuração de SSO que temos agora, mas adicionar outra instância do Discourse e ainda ter uma maneira de limitar o acesso entre a Instância 1 e a Instância 2.

Olá @simon - estou implementando isso no momento e não tenho certeza do motivo pelo qual não estou vendo as opções de Cliente SSO no plugin WP Discourse. Veja a captura de tela abaixo

Minha conexão indica que está ativa (o último uso da chave da API também confirma isso). Ao adicionar o shortcode [discourse_sso_client], parece haver um problema de configuração (o cabeçalho de resposta de localização contém a URL gerada pelo shortcode [discourse_sso_client] em vez da carga útil do SSO.

Isso é intencional. A opção de Cliente SSO está disponível apenas em redes multisite quando configurada em nível de site. Preciso configurar uma rede multisite no meu ambiente de desenvolvimento local para verificar novamente as configurações. Retomo o contato com você sobre isso ainda hoje.

Obrigado — atualmente tenho o plugin instalado no nível da rede com o Cliente SSO selecionado

edição: Rastreei o problema até o query-redirect.php aqui:

if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) ) {
   return;
}

Parece que essa opção não está sendo configurada corretamente para mim — não tenho certeza se é devido à configuração no nível da rede ou outra coisa.

A documentação para configurar o plugin em uma rede multisite está desatualizada. Esta é uma boa oportunidade para organizar e atualizar o guia instalação e configuração do plugin WP Discourse.

Para usar a funcionalidade de cliente SSO em uma rede multisite, o plugin precisa ser configurado no nível da rede. Isso é feito clicando no link Discourse no seu Painel da Rede:

Na página de rede do Discourse, selecione a opção Habilitar Configuração Multisite. Em seguida, insira sua URL do Discourse, Chave de API e Nome de Usuário de Publicação na seção Configurações de Conexão. Role até o final da página e clique no botão Salvar Opções. Você deverá ver a mensagem “Você está conectado ao Discourse!” no topo da página.

Para usar o Discourse como provedor de SSO para sites na sua rede multisite, role até o final da página de rede do Discourse e selecione a opção Habilitar Cliente SSO. Adicione também uma chave na configuração Chave Secreta do SSO. Salve suas opções novamente.

Agora, vá para o seu site Discourse e copie a chave secreta para a configuração do site sso provider secrets do Discourse. Insira o símbolo * como domínio do provedor de SSO. Após salvar essa configuração, ela deve parecer semelhante a esta:

Agora, selecione a opção enable sso provider no Discourse.

Com essas configurações em vigor, acessar a aba SSO / Cliente SSO do WP Discourse para qualquer site na sua rede deve levar você a uma página semelhante a esta:

Para um teste rápido, selecione as opções Adicionar Link de Login e Sincronizar Usuários Existentes por E-mail. Em seguida, faça logout do seu site WordPress. Você deverá conseguir fazer login novamente clicando no link “Login com Discourse” que será exibido na sua página wp-login.php.

Se você não estiver usando a página de login padrão do WordPress, tente copiar o shortcode [discourse_sso_client] para um post no seu site. Esse shortcode exibe marcação na página apenas para usuários deslogados. Você também pode criar um link de login construindo um link neste formato:

<a href="https://example.com/?discourse_sso=1&redirect_to=https://example.comt/">Log in with Discourse</a>

Isso fará com que o usuário faça login no seu site com o Discourse e, em seguida, seja redirecionado de volta para a página do WordPress definida como valor do parâmetro redirect_to.

Com base na sua depuração, parece que a opção Habilitar Cliente SSO não estava ativada na sua página de Rede do Discourse. Você pode verificar se essa opção está ativada e me informar se ainda estiver tendo problemas?

O código que você encontrou, que estava impedindo o Cliente SSO de funcionar para você, está correto, mas é uma condição mal escrita:

if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) )

Ele deve ser simplificado para if ( empty( $this->options['sso-client-enabled'] ) ). Esse é o padrão usado em todo o resto do plugin.