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.