Configura tu DiscourseConnect(DiscourseSSO) en SimpleSAMLphp, usando tu foro Discourse como un proveedor de identidad (IdP) SAML

Discourse ha integrado DiscourseConnect, que te permite convertir tu Discourse en un proveedor de SSO. Puedes encontrarlo en este artículo: “Usar Discourse como proveedor de identidad (SSO, DiscourseConnect)”. Sin embargo, lo que proporciona no es un protocolo SAML u OAuth estándar.

Por lo tanto, necesitamos usar un módulo creado por Paul B. en el foro de Discourse. Este es un módulo que nos permite conectar DiscourseConnect con SimpleSAMLphp y luego usar SimpleSAMLphp para proporcionar un protocolo de servicio de inicio de sesión SAML estándar. Aquí quiero agradecerle enormemente su ayuda, que ha hecho posible esto. También puedes encontrar el módulo aquí:

Ahora empecemos la guía.

Primero, necesitamos configurar SimpleSAMLphp.

Descarga SimpleSAMLphp primero.

wget https://simplesamlphp.org/download?latest

Y luego descomprime.

tar zxf download?latest

Luego mueve el archivo a /var/simplesamlphp.

sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

Luego dale a esta carpeta el usuario www-data y permisos 755.

sudo chown -R www-data:www-data /var/simplesamlphp/
sudo chmod -R 755 /var/simplesamlphp/

Quizás te preguntes por qué la ruta debe ser /var/simplesamlphp, porque la documentación oficial la coloca aquí, necesitarás una configuración adicional si la colocas en otro lugar.

Luego configura nginx y apunta el índice a /www en su carpeta. Si usas Apache, busca la configuración en la documentación oficial.

upstream saml-php-handler {
    server unix:/run/php/php8.0-fpm.sock;
}

server {
        listen 443 ssl;
        server_name TU_DOMINIO_SAML;
        index index.php;
        ssl_certificate    TU_CERTIFICADO;
        ssl_certificate_key    TU_CLAVE;
        ssl_protocols          TLSv1.3 TLSv1.2;
        ssl_ciphers            EECDH+AESGCM:EDH+AESGCM;
        location ^~ /simplesaml {
            alias /var/simplesamlphp/www;
            location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
                include          fastcgi_params;
                fastcgi_pass     saml-php-handler;
                fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
                # Debe ir precedido por la baseurlpath
                fastcgi_param SCRIPT_NAME /simplesaml$phpfile;
                fastcgi_param PATH_INFO $pathinfo if_not_empty;
            }
        }
}

Luego actualiza tu fuente:

sudo apt update

Luego instala el paquete de software:

sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

Aviso: Aquí se requiere que instales según tu versión de php. Por ejemplo, si estás usando php8.0, necesitarás agregar “8.0” después de todos los “php”. Como: php8.0-xml

Reinicia Nginx para activar la nueva extensión php después de que la instalación se haya completado:

sudo systemctl restart Nginx

Luego genera una sal:

openssl rand -base64 32

Copia esta sal.

Luego abre /var/simplesamlphp/config/config.php

'auth.adminpassword' => 'TU_CONTRASEÑA',
'secretsalt' => 'TU_SAL',
'technicalcontact_name' => 'TU_NOMBRE',
'technicalcontact_email' => 'TU_EMAIL',
'language.default' => 'CAMBIA_A_TU_IDIOMA',
'timezone' => 'CAMBIA_A_TU_ZONA',
'enable.saml20-idp' => true,

Luego abre https://TU_DOMINIO_SAML/simplesaml, teóricamente tu SimpleSAMLphp debería estar funcionando ahora.

Luego instala Composer.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/bin/composer

Luego deberías escribir composer para ejecutar.

Ve a /var/simplesamlphp, edita composer.json, cambia la versión a dev-master.

La razón por la que hacemos esto aquí es porque el módulo discourse-simplesamlphp requiere la versión “dev-master”, sin embargo, su versión predeterminada es un número, por lo que necesitamos cambiar la versión a “dev-master”.

Luego comienza a instalar este módulo.

composer require swcc/simplesamlphp-module-authdiscourse dev-master --ignore-platform-reqs

El parámetro “–ignore-platform-reqs” es para evitar que tu versión de php no cumpla con el requisito.

Ahora deberías ver que composer comienza a instalar swcc/simplesamlphp-module-authdiscourse.

Después de completar la instalación, ingresa:

touch /var/simplesamlphp/modules/authdiscourse/enable

Para habilitar este plugin.



Luego habilita las opciones “Secretos del proveedor de Discourse Connect” y “Habilitar proveedor de Discourse Connect” en tu foro de Discourse.

En “Secretos del proveedor de Discourse Connect”, ingresa tu dominio SAML y una clave secreta de SSO.

Luego edita config/authsources.php en la carpeta de simplesamlphp:

<?php
$config = [
    // Esta es una fuente de autenticación que maneja la autenticación de administrador.
    'admin' => [
        'core:AdminPassword',
    ],

    // Esta es la fuente de autenticación que utiliza la autenticación de Discourse.
    'discourse-sso' => [
      'authdiscourse:Discourse',
      'url' => 'https://discourse.your-domain.org',
      'secret' => '<tu-clave-secreta-sso>',
    ],

];

Necesitas agregar esta parte en el lugar adecuado:

    'discourse-sso' => [
      'authdiscourse:Discourse',
      'url' => 'TU_DOMINIO_DISCOURSE',
      'secret' => 'CLAVE_SECRETA_SSO_DISCOURSE',
    ],

Para permitir que SimpleSAMLphp use discourse-sso para la autenticación.

Finalmente, abre https://TU_DOMINIO_SAML/simplesaml/module.php/core/authenticate.php?as=discourse-sso

O

Abre https://TU_DOMINIO_SAML/simplesaml/ luego haz clic en autenticación y luego en discourse-sso para probar.

Si devuelve la información correcta, significa que has configurado correctamente tu SimpleSAMLphp para conectarse a tu Discourse.

Ahora necesitas configurar los ajustes de tu IdP.

Primero necesitas generar un certificado para el IdP usando:

openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out TU_DOMINIO_SAML.crt -keyout TU_DOMINIO_SAML.pem

Si lo generas en el directorio raíz, puedes ver tu nuevo certificado allí.

Luego mueve tu certificado a donde quieras, luego dáselos al usuario www-data y permisos 755.

chown -R www-data:www-data /RUTA_TU_CERTIFICADO
chmod -R 755 /RUTA_TU_CERTIFICADO

Finalmente, edita la ruta de tu certificado y tu fuente de autenticación en metadata/saml20-idp-hosted.php.

<?php
$metadata['__DYNAMIC:1__'] = [
    /*
     * El nombre de host para este IdP. Esto hace posible ejecutar múltiples
     * IdPs desde la misma configuración. '__DEFAULT__' significa que este
     * debe usarse por defecto.
     */
    'host' => '__DEFAULT__',

    /*
     * La clave privada y el certificado a usar al firmar respuestas.
     * Estos se almacenan en el directorio cert.
     */
    'privatekey' => '/RUTA_TU_CLAVE',
    'certificate' => '/RUTA_TU_CERTIFICADO',
    /*
     * La fuente de autenticación que debe usarse para autenticar al
     * usuario. Debe coincidir con una de las entradas en config/authsources.php.
     * NOTA: NECESITAS CAMBIAR EL MÉTODO DE AUTENTICACIÓN A "discourse-sso"
     */
    'auth' => 'discourse-sso',
];

Ahora tu SimpleSAMLphp está utilizando Discourse como backend de base de datos de usuarios, como un IdP SAML, proporcionando un protocolo de inicio de sesión SAML estándar.

ID de IdP (URI): https://TU_DOMINIO_SAML/simplesaml/saml2/idp/metadata.php

URL de destino (se utiliza para enviar el requisito de identificación del SP): https://TU_DOMINIO_SAML/simplesaml/saml2/idp/SSOService.php

Certificado X509: https://TU_DOMINIO_SAML/simplesaml/module.php/saml/idp/certs.php/idp.crt

O para aquellos SP que te permiten cargar el archivo de metadatos del IdP directamente, puedes descargar los metadatos del IdP: https://TU_DOMINIO_SAML/simplesaml/saml2/idp/metadata.php

Todo listo. Todo debería estar funcionando ahora.

Disfruta~

A continuación, puede que introduzca cómo conectar SimpleSAMLphp, potenciado por Discourse, como forma de inicio de sesión SAML de NextCloud.

Cualquier malentendido puede responder a esta publicación o contactarme a través de admin@rail.moe.

11 Me gusta

¡Gracias por esta guía! ¡En realidad estoy muy interesado en hacer este cambio! No entendí completamente cómo configurar esto, pero intentaré hacerlo cuando tenga la oportunidad.

Oye, ¿alguien ha probado esto recientemente? Estoy ejecutando discourse 3.3 y simpleSAMLphp 2.2.1 y no consigo que funcione. Estoy en el paso de prueba. El enlace ya no funciona, pero encontré una opción de prueba en el panel de administración de simplesamls. Pero estoy recibiendo esta excepción aquí:

SimpleSAML\Error\Error: UNHANDLEDEXCEPTION
Backtrace:
3 src/SimpleSAML/Error/ExceptionHandler.php:35 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)
2 vendor/symfony/error-handler/ErrorHandler.php:535 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)
1 vendor/symfony/error-handler/ErrorHandler.php:627 (Symfony\Component\ErrorHandler\ErrorHandler::handleFatalError)
0 [builtin] (N/A)
Caused by: Symfony\Component\ErrorHandler\Error\FatalError: Compile Error: Declaration of SimpleSAML\Module\authdiscourse\Auth\Source\Discourse::authenticate(&$state) must be compatible with SimpleSAML\Auth\Source::authenticate(array &$state): void
Backtrace:
0 modules/authdiscourse/lib/Auth/Source/Discourse.php:73 (N/A)

He revisado todos los pasos varias veces, pero el módulo no se ha actualizado en 4 años y temo que ya no sea compatible. ¿Alguien sigue usando esto?

Entonces, ¿qué protocolo utiliza DiscourseConnect? Estaba probando un cliente oAuth2 pero me di cuenta de que los parámetros no son exactamente los mismos :frowning:

1 me gusta