Single Sign On pode ser usado para gerenciar a autenticação de usuários do Discourse a partir de um site separado. O tópico Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) contém detalhes sobre como implementar o DiscourseConnect.
O Problema
Com o DiscourseConnect, os usuários do Discourse serão criados ou atualizados quando fizerem login no Discourse a partir do seu site externo. No entanto, isso não resolve o caso em que você precisa criar ou atualizar usuários do Discourse sem que eles façam login no seu site. Para sites que utilizam o DiscourseConnect, esses casos devem ser tratados fazendo uma solicitação POST autenticada para a rota sync_sso.
\u003e
Se você estiver usando a gem da API do Discourse, pode usar o método sync_sso da gem em vez do código abaixo. Consulte o diretório examples para instruções sobre como usar o método.
Como exemplo, vamos considerar um caso em que um usuário é adicionado a um grupo no site principal e precisa ser adicionado a um grupo correspondente no Discourse sem precisar fazer login primeiro com o DiscourseConnect. O nome do grupo tanto no site quanto no fórum é ‘eurorack’. O external_id do usuário é 1 e seu e-mail é bob@example.com. O código a seguir usa PHP. A ideia básica pode ser aplicada a qualquer linguagem de programação.
Configure suas credenciais de API e a chave secreta do SSO
$api_key = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
$api_username = 'system';
$discourse_connect_secret = 'jdhb19*Xh3!nu(#k';
Configure os parâmetros do SSO
Para ver quais parâmetros estão disponíveis, consulte a seção ACCESSORS de discourse_connect_base.rb. O parâmetro que você deve incluir para atualizar um usuário existente é o external_id. Se estiver chamando sync_sso para um usuário que ainda não existe no Discourse, você deve incluir os parâmetros username e email. O Discourse usará o username e o email para criar um novo usuário.
Para adicionar um usuário a um grupo, inclua o parâmetro add_groups. Para remover um usuário de um grupo, inclua o parâmetro remove_groups. O valor para qualquer um desses parâmetros deve ser definido como uma string de nomes de grupo separados por vírgula. Não são permitidos espaços entre os nomes dos grupos.
\u003e
O parâmetro require_activation está sendo incluído no payload. Ele deve ser definido como true se o e-mail do usuário não tiver sido validado no site principal. Com PHP, o parâmetro precisa ser definido como a string ‘true’ para evitar que seja convertido para o número 1. Se você já validou o endereço de e-mail do usuário, não precisa incluir este parâmetro.
// Crie um array de parâmetros do SSO.
$sso_params = array(
'external_id' => 1,
'email' => 'bob@example.com',
'username' => 'bob',
'add_groups' => 'eurorack',
'require_activation' => 'true',
);
// Converta os parâmetros do SSO no payload do SSO e gere a assinatura do SSO.
$sso_payload = base64_encode( http_build_query( $sso_params ) );
$sig = hash_hmac( 'sha256', $sso_payload, $discourse_connect_secret );
Envie a solicitação POST
Para este exemplo, usarei curl, definirei o user_agent como ‘WordPress/4.9.4’ e a URL do fórum como https://forum.example.com.
$url = 'https://forum.example.com/admin/users/sync_sso';
$post_fields = array(
'sso' => $sso_payload,
'sig' => $sig,
);
$headers = array("Content-Type: multipart/form-data;","Api-Key: $api_key","Api-Username: $api_username",);
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $post_fields ) );
curl_setopt( $ch, CURLOPT_USERAGENT, 'WordPress/4.9.4' );
$result = curl_exec( $ch );
if ( curl_errno( $ch ) !== 0 ) {
// Lide com o erro, chame curl_close( $ch ) e retorne.
}
curl_close( $ch );
$discourse_user = json_decode( $result );
Atualizando usuários existentes
As solicitações feitas para a rota sync_sso atualizarão as propriedades de usuários existentes da mesma forma que ocorreria se o usuário fizesse login no site com o DiscourseConnect. Isso significa que os valores das configurações do site auth overrides e discourse connect overrides do seu site serão respeitados nessas solicitações. Por exemplo, para atualizar o endereço de e-mail de usuários existentes com solicitações a sync_sso, a configuração auth overrides email precisa estar habilitada. Aqui estão as configurações relevantes:
auth overrides emailauth overrides usernameauth overrides namediscourse connect overrides avatardiscourse connect overrides biodiscourse connect overrides groupsdiscourse connect overrides profile backgrounddiscourse connect overrides card backgrounddiscourse connect overrides locationdiscourse connect overrides website
Leitura Adicional
Para ver o que está acontecendo, consulte o código do sync_sso, o método parse de DiscourseConnectBase e o método lookup_or_create_user de DiscourseConnect.
Também há uma versão em JavaScript deste guia para quem usa Node.js.