Sincronizar los datos de usuario de DiscourseConnect con la ruta sync_sso

Single Sign On puede utilizarse para gestionar la autenticación de usuarios de Discourse desde un sitio separado. El tema Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) contiene detalles sobre cómo implementar DiscourseConnect.

El problema

Con DiscourseConnect, los usuarios de Discourse se crearán o actualizarán cuando inicien sesión en Discourse desde tu sitio web externo. Sin embargo, esto no cubre los casos en los que necesitas crear o actualizar usuarios de Discourse sin que estos inicien sesión en tu sitio. Para sitios que utilizan DiscourseConnect, estos casos deben gestionarse realizando una solicitud POST autenticada a la ruta sync_sso.

:information_source: Si estás utilizando el gem de la API de Discourse, puedes usar el método sync_sso del gem en lugar del siguiente código. Consulta el directorio de ejemplos para obtener instrucciones sobre cómo usar el método.

Como ejemplo, tomaremos un caso en el que se añade un usuario a un grupo en el sitio principal y necesita ser añadido al grupo correspondiente en Discourse sin tener que iniciar sesión primero con DiscourseConnect. El nombre del grupo tanto en el sitio web como en el foro es ‘eurorack’. El external_id del usuario es 1 y su correo electrónico es bob@example.com. El siguiente código utiliza PHP. La idea básica puede aplicarse a cualquier lenguaje de programación.

Configura tus credenciales de API y la clave secreta de SSO

$api_key = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
$api_username = 'system';
$discourse_connect_secret = 'jdhb19*Xh3!nu(#k';

Configura los parámetros de SSO

Para ver qué parámetros están disponibles, consulta la sección ACCESSORS de discourse_connect_base.rb. El parámetro que debes incluir para actualizar un usuario existente es external_id. Si estás llamando a sync_sso para un usuario que aún no existe en Discourse, debes incluir los parámetros username y email. Discourse utilizará el username y el email para crear un nuevo usuario.

Para añadir un usuario a un grupo, incluye el parámetro add_groups. Para eliminar un usuario de un grupo, incluye el parámetro remove_groups. El valor de cualquiera de estos parámetros debe establecerse como una cadena de nombres de grupo separados por comas. No se permiten espacios entre los nombres de los grupos.

:information_source: El parámetro require_activation se incluye en la carga útil. Debe establecerse en true si el correo electrónico del usuario no ha sido validado en el sitio principal. Con PHP, el parámetro debe establecerse como la cadena ‘true’ para evitar que se convierta en el número 1. Si has validado la dirección de correo electrónico del usuario, no es necesario incluir este parámetro.

// Crear un array de parámetros de SSO.
$sso_params = array(
    'external_id' => 1,
    'email' => 'bob@example.com',
    'username' => 'bob',
    'add_groups' => 'eurorack',
    'require_activation' => 'true',
);

// Convertir los parámetros de SSO en la carga útil de SSO y generar la firma de SSO.
$sso_payload = base64_encode( http_build_query( $sso_params ) );
$sig = hash_hmac( 'sha256', $sso_payload, $discourse_connect_secret );

Envía la solicitud POST

Para este ejemplo, usaré curl, estableceré el user_agent en ‘WordPress/4.9.4’ y la URL del foro en 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 ) {
    // Manejar el error, llamar a curl_close( $ch ) y retornar.
}

curl_close( $ch );

$discourse_user = json_decode( $result );

Actualización de usuarios existentes

Las solicitudes realizadas a la ruta sync_sso actualizarán las propiedades de los usuarios existentes de la misma manera que ocurriría si el usuario iniciara sesión en el sitio con DiscourseConnect. Esto significa que se respetarán los valores de las configuraciones del sitio auth overrides y discourse connect overrides para estas solicitudes. Por ejemplo, para actualizar la dirección de correo electrónico de usuarios existentes mediante solicitudes a sync_sso, es necesario habilitar la configuración auth overrides email. Estas son las configuraciones 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

Lectura adicional

Para ver qué está ocurriendo, consulta el código de sync_sso, el método parse de DiscourseConnectBase y el método lookup_or_create_user de DiscourseConnect.

También existe una edición en JavaScript de esta guía para quienes utilizan Node.js.

32 Me gusta
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?

Recibiendo este mensaje: {“failed”:“FALLIDO”,“message”:“Error de inicio de sesión”}