Sincronize os dados do usuário DiscourseConnect com a rota sync_sso

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 :information_source: 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 :information_source: 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 email
  • auth overrides username
  • auth overrides name
  • discourse connect overrides avatar
  • discourse connect overrides bio
  • discourse connect overrides groups
  • discourse connect overrides profile background
  • discourse connect overrides card background
  • discourse connect overrides location
  • discourse 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.

32 curtidas
Sync DiscourseConnect user data with the sync_sso route [JavaScript]
/admin/users/sync_sso ... Route not found
SSO_SYNC not working
Using the API to create a user on an SSO only system
SSO integration & external profile sync help
Creating Discourse accounts via SSO without visiting the forum URL?
Sync_sso post suddenly resulting in 404 not found after succesfully adding a portion of the users
Changing avatar_url while sso_overrides_avatar is set?
"push" sso users to discourse?
Groups API - manually syncing group membership?
SSO_SYNC not working
PHP/API to check whether user exists (by email) and is in specific group
Pre-create user accounts for SSO users
User profile page by id?
DiscourseConnect Provider Questions
Logging in discourse using API - using discourse as API server only
I cannot add user to the discouse forum from a wordpress website when user added in a membership
Integration into custom auth system where emails are not unique?
:cn: Synchronizing DiscourseConnect user data using sync_sso [Java] | 使用 sync_sso 同步 DiscourseConnect 用户数据 [Java]
Letting users choose whether to show Full Name
Auto-provisioning user accounts when SSO is enabled
Creating Discourse accounts during user import
Refresh sso groups
/admin/users/sync_sso 403 Forbidden
Triggering automatic authentication via SSO when linking to private topics?
"BAD CSRF" when executing PUT using API, curl, and PHP
Delete user avatar by API
Delete user avatar by API
Help me troubleshoot my Discourse SSO
Adding existing (and inviting new) users to a group
Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)
DiscourseConnect, SSO and E-Mail address confirmation
AUTOMATIC: Inviting every new SaaS signup into the Discourse Forum
Question necromancy: migrating from mattermost
Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)
How to "intercept" first time SSO usages to let users confirm the SSO action and set a username?
API Create user external_ids parameter
First time login for a user using API KEY
How to use Discourse Connect (SSO) to update avatar, username, name?
How to set language for SSO users
What are your experiences with wp-discourse plugin and DiscourseConnect?

Recebendo esta mensagem: {"failed":"FALHA","message":"Erro de login"}