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.
Si estás utilizando el gem de la API de Discourse, puedes usar el método
sync_ssodel 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.
El parámetro
require_activationse incluye en la carga útil. Debe establecerse entruesi el correo electrónico del usuario no ha sido validado en el sitio principal. ConPHP, el parámetro debe establecerse como la cadena ‘true’ para evitar que se convierta en el número1. 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 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
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.