Cuando se utiliza Discourse como un Proveedor de DiscourseConnect (Proveedor SSO), la dirección de correo electrónico del usuario se expone en la URL de redirección 302 al relying party (parte que confía). Esto sucede porque el método populate_user_data en lib/second_factor/actions/discourse_connect_provider.rb siempre establece el correo electrónico:
Este correo electrónico se codifica en Base64 y se incluye en la URL de redirección: https://sitio-destino.com/callback?sso=<payload_base64>&sig=<firma_hmac>
La decodificación del payload base64 revela la dirección de correo electrónico en texto plano.
Impacto
Historial del navegador: El correo electrónico se registra en el historial del navegador
Registros de Nginx: La URL completa se registra en los registros de acceso de nginx
Registros del sitio de destino: El relying party recibe el correo electrónico sin consentimiento explícito del usuario
Expectativa del usuario: Los usuarios normalmente autorizan para demostrar “Soy un usuario legítimo”, no esperan que se comparta su correo electrónico
Comportamiento esperado
Los usuarios deben poder controlar si su correo electrónico se comparte con el relying party. Debería haber una opción de configuración similar a discourse_connect_overrides_groups, discourse_connect_overrides_avatar, etc.
Actualmente no hay una configuración del sitio para deshabilitar este comportamiento. Escribir un plugin para anular este comportamiento es posible pero no es lo ideal.
Hacer que un usuario se autentique a través del Proveedor DiscourseConnect
Comprobar la URL de redirección 302: el correo electrónico es visible en los parámetros de la URL
La URL de redirección se ve así: https://relying-party.com/sso?sso=bm9uY2U9xxx&sig=xxx
La decodificación del parámetro sso revela: nonce=xxx&return_sso_url=xxx&email=user@example.com&external_id=123
Entorno
Versión de Discourse: (más reciente)
Autohospedado
Sugerencias de posibles soluciones
Añadir una configuración del sitio como discourse_connect_provider_includes_email (predeterminado: true para compatibilidad con versiones anteriores) para controlar si el correo electrónico se incluye en la respuesta
O implementar el callback basado en POST en lugar de la redirección GET 302 para evitar el registro de la URL
La firma HMAC solo garantiza que la carga útil no ha sido manipulada; no cifra los datos. Base64 es codificación, no cifrado, por lo que cualquiera puede decodificarlo para leer el contenido.
El problema principal es: no queremos exponer información de usuario innecesaria (como el correo electrónico) a “sitios de terceros que utilizan Discourse para el inicio de sesión SSO”. Los usuarios autorizan solo para demostrar “Soy un usuario legítimo”, no esperan que se comparta su correo electrónico.
¿Sería aceptable una configuración del sitio para controlar si se devuelve el correo electrónico?
Para darte algo de contexto sobre el caso de uso: nuestro foro es un “foro del campus”, y un estudiante creó un sitio web gratuito para que lo usen otros estudiantes. Quieren usar nuestro foro del campus basado en Discourse para autenticar si un usuario es realmente un estudiante de nuestra escuela, esencialmente probando “Soy un estudiante legítimo aquí”.
En este escenario, el sitio web externo solo necesita saber “este es un usuario válido de nuestro foro del campus”, no necesariamente necesita el correo electrónico del usuario, que es información sensible que no debe compartirse innecesariamente.
Trabajaré en una solicitud de extracción (PR) que agregue una configuración del sitio para controlar este comportamiento, con un valor predeterminado que mantenga la compatibilidad con versiones anteriores para las instalaciones existentes.