Configurar DiscourseConnect: el sistema oficial de inicio de sesión único (SSO) para Discourse

DiscourseConnect es una característica central de Discourse que te permite configurar “Inicio de sesión único (SSO)” para delegar completamente todo el registro y acceso de usuarios de Discourse a otro sitio. Disponible para nuestros clientes de alojamiento Pro, Business y Enterprise.

:information_source: (Feb 2021) ‘Discourse SSO’ ahora es ‘DiscourseConnect’. Si ejecutas una versión antigua de Discourse, la configuración a continuación se nombrará sso_... en lugar de discourse_connect_...

El problema

Muchos sitios que desean integrarse con un sitio de Discourse quieren mantener todo el registro de usuarios en un sitio separado. En tal configuración, todas las operaciones de inicio de sesión deben delegarse a ese otro sitio.

¿Qué pasa si quiero SSO junto con la autenticación existente?

La intención de DiscourseConnect es reemplazar la autenticación de Discourse. Si deseas agregar un nuevo proveedor, consulta plugins existentes como: Discourse VK Authentication (vkontakte)

Habilitar DiscourseConnect

Para habilitar DiscourseConnect, debes completar 3 configuraciones:

enable_discourse_connect: debe estar habilitado, interruptor global
discourse_connect_url: la URL externa a la que se enviarán los usuarios cuando intenten iniciar sesión
discourse_connect_secret: una cadena secreta utilizada para hashear las cargas útiles de SSO. Asegura que las cargas útiles sean auténticas.

Una vez que enable_discourse_connect se establece en true:

  • Hacer clic en “iniciar sesión” o en el avatar te redirigirá a /session/sso, que a su vez redirigirá a los usuarios a discourse_connect_url con una carga útil firmada.
  • No se permitirá a los usuarios “cambiar contraseña”. Ese campo se elimina del perfil de usuario.
  • Los usuarios ya no podrán usar la autenticación de Discourse (nombre de usuario/contraseña, Google, etc.).

¿Qué pasa si lo marcas por error?

Consulta: Log back in as admin after locking yourself out with read-only mode or an invalid SSO configuration

Implementar DiscourseConnect en tu sitio

:warning: Discourse utiliza correos electrónicos para mapear usuarios externos a usuarios de Discourse, y asume que los correos electrónicos externos son seguros. ¡SI NO VALIDAS LAS DIRECCIONES DE CORREO ELECTRÓNICO ANTES DE ENVIARLAS A DISCOURSE, TU SITIO SERÁ EXTREMADAMENTE VULNERABLE!

Alternativamente, si insistes en enviar correos electrónicos no validados, ASEGÚRATE de establecer require_activation=true, lo que obligará a que todos los correos electrónicos sean validados por Discourse. AÚN RECOMENDAMOS ENÉRGICAMENTE QUE NO HAGAS ESTO, por lo que si procedes con esa configuración habilitada, asumes un riesgo sustancial.

Discourse redirigirá a los clientes a discourse_connect_url con una carga útil firmada: (digamos que discourse_connect_url es https://somesite.com/sso)

Recibirás tráfico entrante con lo siguiente:

https://somesite.com/sso?sso=CARGA&sig=FIRMA

La carga útil es una cadena codificada en Base64 que consta de un nonce y una return_sso_url. La carga útil siempre es una cadena de consulta válida.

Por ejemplo, si el nonce es ABCD, la carga útil cruda será:

nonce=ABCD&return_sso_url=https%3A%2F%2Fdiscourse_site%2Fsession%2Fsso_login, esta carga útil cruda está codificada en base 64.

El punto de acceso que se llama debe:

  1. Validar la firma: asegurarse de que el HMAC-SHA256 de CARGA (usando discourse_connect_secret como clave) sea igual a sig (sig estará codificado en hexadecimal).
  2. Realizar la autenticación que corresponda.
  3. Crear una nueva carga útil codificada en URL con al menos nonce, email y external_id. También puedes proporcionar datos adicionales; aquí tienes una lista de todas las claves que Discourse entenderá:
    • nonce debe copiarse desde la carga útil de entrada.
    • email debe ser una dirección de correo electrónico verificada. Si la dirección de correo electrónico no ha sido verificada, establece require_activation en “true”.
    • external_id es cualquier cadena única para el usuario que nunca cambiará, incluso si su correo electrónico, nombre, etc. cambian. El valor sugerido es el número de fila ‘id’ de tu base de datos.
    • username se convertirá en el nombre de usuario en Discourse si el usuario es nuevo o si SiteSetting.auth_overrides_username está establecido.
    • name se convertirá en el nombre completo en Discourse si el usuario es nuevo o si SiteSetting.auth_overrides_name está establecido.
    • avatar_url se descargará y establecerá como el avatar del usuario si el usuario es nuevo o si SiteSetting.discourse_connect_overrides_avatar está establecido.
    • avatar_force_update es un campo booleano. Si se establece en true, obligará a Discourse a actualizar el avatar del usuario, haya cambiado avatar_url o no.
    • bio se convertirá en el contenido de la biografía del usuario si el usuario es nuevo, su biografía está vacía o SiteSetting.discourse_connect_overrides_bio está establecido.
    • title establecerá el título del usuario.
    • website establecerá el sitio web del usuario en su perfil.
    • location establecerá la ubicación del usuario en su perfil.
    • profile_background_url se descargará y establecerá como el fondo del perfil del usuario si el usuario es nuevo o si SiteSetting.discourse_connect_overrides_profile_background está establecido.
    • card_background_url se descargará y establecerá como el fondo de la tarjeta del usuario si el usuario es nuevo o si SiteSetting.discourse_connect_overrides_card_background está establecido.
    • locale establecerá la configuración regional del usuario si el usuario es nuevo y SiteSetting.allow_user_locale está habilitado.
    • locale_force_update es un campo booleano. Si se establece en true junto con locale, forzará la actualización de la configuración regional para usuarios existentes (requiere SiteSetting.allow_user_locale).
    • Los campos booleanos adicionales (“true” o “false”) son: admin, moderator, suppress_welcome_message, logout
  4. Codificar la carga útil en Base64.
  5. Calcular un hash HMAC-SHA256 de la carga útil usando discourse_connect_secret como clave y la carga útil codificada en Base64 como texto.
  6. Redirigir de nuevo a return_sso_url con un parámetro de consulta sso y sig (http://discourse_site/session/sso_login?sso=carga&sig=firma).

Discourse validará que el nonce sea válido y, si lo es, lo expirará inmediatamente para que no pueda usarse nuevamente. Luego, intentará:

  1. Iniciar sesión en el usuario buscando un external_id ya asociado en el modelo SingleSignOnRecord.
  2. Iniciar sesión en el usuario usando el correo electrónico proporcionado (actualizando external_id) (a menos que require_activation = true).
  3. Crear una nueva cuenta para el usuario proporcionando (email, username, name) y actualizando external_id.

Preocupaciones de seguridad

El nonce (token de un solo uso) expirará automáticamente después de 30 minutos. Esto significa que tan pronto como el usuario sea redirigido a tu sitio, tendrá 30 minutos para iniciar sesión o crear una nueva cuenta.

El protocolo es seguro contra ataques de repetición, ya que el nonce solo puede usarse una vez. El nonce está vinculado a la sesión actual del navegador para proteger contra ataques CSRF.

Especificar membresía en grupos

Si se especifica la opción discourse connect overrides groups, Discourse considerará la lista separada por comas de grupos pasada en groups.

Además de groups, también puedes especificar la membresía en grupos en tu carga útil SSO usando los atributos add_groups y remove_groups, independientemente de la opción discourse connect overrides groups.

add_groups es una lista separada por comas de nombres de grupos de los que nos aseguraremos de que el usuario sea miembro.
remove_groups es una lista separada por comas de nombres de grupos de los que nos aseguraremos de que el usuario no sea miembro.

Implementación de referencia

Discourse contiene una implementación de referencia de la clase SSO:

Una implementación trivial sería:

class DiscourseSsoController < ApplicationController
  def sso
    secret = "MY_SECRET_STRING"
    sso = DiscourseApi::SingleSignOn.parse(request.query_string, secret)
    sso.email = "user@email.com"
    sso.name = "Bill Hicks"
    sso.username = "bill@hicks.com"
    sso.external_id = "123" # id único para cada usuario de tu aplicación
    sso.sso_secret = secret

    redirect_to sso.to_url("http://l.discourse/session/sso_login")
  end
end

Transición hacia y desde el inicio de sesión único.

Mientras el parámetro require_activation no se establezca en true en la carga útil de la solicitud, el sistema confiará en los correos electrónicos proporcionados por el punto de acceso SSO. Esto significa que si tenías una cuenta existente en el pasado en Discourse con DiscourseConnect deshabilitado, DiscourseConnect simplemente la reutilizará y evitará crear una nueva cuenta.

Si alguna vez desactivas DiscourseConnect, los usuarios podrán restablecer sus contraseñas y recuperar el acceso a sus cuentas.

Ejemplo del mundo real:

Dadas las siguientes configuraciones:

Dominio de Discourse: http://discuss.example.com
URL de DiscourseConnect: http://www.example.com/discourse/sso
Secreto de DiscourseConnect: d836444a9e4084d5b224a60c208dce14
Correo electrónico validado: No (agrega require_activation=true a la carga útil)

Intento de inicio de sesión del usuario

  • Se genera un nonce: cb68251eefb5211e58c00ff1395f0c0b

  • Se genera la carga útil cruda: nonce=cb68251eefb5211e58c00ff1395f0c0b

  • La carga útil se codifica en Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=

  • La carga útil se codifica en URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D

  • Se genera un HMAC-SHA256 en la carga útil codificada en Base64: 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Finalmente, el navegador se redirige a:

http://www.example.com/discourse/sso?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D&sig=1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

En el otro extremo

  1. La carga útil se valida usando HMAC-SHA256; si la firma no coincide, el proceso se interrumpe.
  2. Al revertir los pasos anteriores, se extrae el nonce.

El usuario inicia sesión:

name: sam
external_id: hello123
email: test@test.com
username: samsam
require_activation: true

Se genera una carga útil sin firmar:

nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true

el orden no importa, los valores están codificados en URL

La carga útil se codifica en Base64:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

La carga útil se codifica en URL:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

La carga útil codificada en Base64 se firma:

3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

El navegador redirige a:

http://discuss.example.com/session/sso_login?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D&sig=3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Sincronizar registros de DiscourseConnect

Puedes usar el punto de acceso POST /admin/users/sync_sso para sincronizar un registro de DiscourseConnect; pásale el mismo registro que pasarías al punto de acceso de DiscourseConnect; el nonce no importa.

Si llamas a admin/users/sync_sso desde otro sitio, deberás incluir una api_key de administrador válida y un api_username válido en los encabezados de la solicitud. Consulta Sync DiscourseConnect user data with the sync_sso route para más detalles sobre cómo estructurar la solicitud.

Borrar registros de DiscourseConnect

Si los valores de external_id de tu proveedor de DiscourseConnect han cambiado (quizás cambiaste el algoritmo de generación, quizás es un punto de acceso diferente), puedes eliminar de forma segura todos los registros existentes usando la consola de Rails:

SingleSignOnRecord.destroy_all

Cerrar sesión de usuarios

Puedes usar el punto de acceso POST /admin/users/{USER_ID}/log_out para cerrar la sesión de cualquier usuario en el sistema si es necesario.

Para configurar el punto de acceso al que Discourse redirige al cerrar sesión, busca la configuración logout redirect. Si no se ha establecido ninguna URL aquí, serás redirigido de nuevo a la URL configurada en discourse connect url.

Buscar usuarios por external_id

Los datos del perfil del usuario se pueden acceder usando el punto de acceso /users/by-external/{EXTERNAL_ID}.json. Esto devolverá una carga útil JSON que contiene la información del usuario, incluido el user_id, que se puede usar con el punto de acceso log_out.

Implementaciones existentes

  • El gem discourse_api se puede usar para SSO. Echa un vistazo al código SSO en su directorio de ejemplos para ver una implementación básica.

  • Nuestro plugin de WordPress facilita la configuración de SSO entre WordPress y Discourse. Los detalles sobre cómo configurarlo se encuentran en la pestaña SSO de la página de opciones del plugin.

Trabajo futuro

  • Nos gustaría recopilar más implementaciones de referencia para SSO en otras plataformas. Si tienes una, por favor publica en la categoría Dev / SSO.

Características avanzadas

  • Puedes pasar campos de usuario personalizados anteponiendo el nombre del campo con custom. Por ejemplo, custom.user_field_1 se puede usar para establecer el valor de UserCustomField que tiene el nombre user_field_1.
  • Puedes pasar avatar_url para sobrescribir el avatar del usuario (se debe habilitar SiteSetting.discourse_connect_overrides_avatar). Los avatares se almacenan en caché, así que pasa avatar_force_update=true para forzar su actualización si la URL es la misma. Por ahora, no puedes pasar una URL vacía para deshabilitar el avatar de los usuarios.
  • Por defecto, el mensaje de bienvenida se enviará a todos los usuarios nuevos creados a través de SSO. Si deseas suprimir esto, puedes pasar suppress_welcome_message=true.
  • Para configurar tu instancia de Discourse como proveedor de Discourse Connect, consulta: Usar DiscourseConnect como proveedor de identidad.

Depurar tu proveedor de DiscourseConnect

Para ayudar en la depuración de DiscourseConnect, puedes habilitar la configuración del sitio verbose_discourse_connect_logging. Al habilitar esa configuración del sitio, aparecerán diagnósticos detallados en YOURSITE.com/logs. Asegúrate de marcar la casilla :white_check_mark: de warnings en la parte inferior de YOURSITE.com/logs.

Registraremos una advertencia en los registros con un volcado completo de la carga útil SSO:

  • Cada vez que se inicia el proceso de DiscourseConnect, registraremos una advertencia en el registro con un volcado completo de la carga útil de DiscourseConnect.

  • Cada vez que un usuario no logra completar DiscourseConnect (debido a la expiración del nonce o bloqueo de IP).

:spiral_notepad: ¿Necesitas automatizar los registros de usuarios? Consulta Auto-provisioning user accounts when SSO is enabled

174 Me gusta
Discourse SSO + normal login
Sync DiscourseConnect user data with the sync_sso route
SSO login & logout issues
Is there a "log_in" SSO API endpoint?
SSO locked me out of Discourse!
What is the SSO login URL
With SSO my user still need to hit the login button
SSO Login page not showing up
How to handle Discourse SSO when the authentication site allows users to change emails?
"User Log out API" return success in response but user session still alive
SSO integration & external profile sync help
SSO on Discourse using Atlassian Crowd
Single Sign-Out?
Mobile (firebase) SSO authentication
Login to Discourse with website account details
Discourse SSO using auth0 via URL
Users who register on my site, register also on Discourse Vise Versa
Custom Login / Registration from another API
Automatically assigning users to a group
SSO and e-mail addresses having a plus sign
Automatic session management with OAuth SSO
Merging users from different forums
Advantage and disadvantage of enabling SSO
About the SSO category
Shibboleth / SAML / SSO -- Working Implementation for Higher Ed
How to generate nonce from client-side Javascript
Logout POST Request
Customized login auth plugin
User Fields to validate users
Enable sso for my site
Disable email verification for SSO
SSO with TownNews CMS
Using existing RoR application for user auth / signup instead of discourse
[PAID] Setup SSO for self-hosted instance
SSO locked me out of Discourse!
Discourse Ruby API testing "Unknown attribute 'auth_token' for User
Switching out authentication for a passwordless alternative
A way for admins to edit users' external IDs
Hashing Secret + Payload for SSO
Will Discourse ask for a username if it's not provided to /session/sso_login?
Categorizing and tracking users
Getting signed data from the server
Getting signed data from the server
SSO and changing email addresses upstream
SSO (maybe) specific issue
SSO (maybe) specific issue
Why isn't Discourse more frequently recommended as a "community platform"?
Integration with .NET MVC application for a SaaS platform
Running my own discourse image
How do I make discourse use my platform's autentication system?
Automatic addition of users to group based on email domain
Allowing people to login using accounts from other websites
Seeking Slack Login / SSO for Discourse
Smooth J/K navigation when using keyboard
SSO to Joomla site
Discourse Connect on Local instance is not working
Implementing SSO for dev environment and troubleshoot
Login with FB, google and apple only
SSO provider implementation - Admin, moderator and groups ignored?
How to divide my community into 2 parts
Using Discourse to add a forum feature to our current application?
Shared cookie SSO: Notifying frontend
User auth with website at root and Discourse in subfolder
Can I authenticate to Drupal via Discourse?
Difficulty of Tiered-access forum
Any way to not require email verification with WP as the SSO Provider?
How to enable sso on discourse?
How to auto-login user in application web view
[PAID] automatically change user email
Create apikey for user programmatically as admin
Bug when visiting same thread url
Open source will support customized provider SSO
Is there a way to get all emails of users with the API?
How can generate _forum_session and _t for an user through code/api call or without login to browser?
Show/hide forums based on the domain? (Shared forum via CNAME)
Integrate with DjangoRest and Vue.js
Connect Discourse Auth with my Django user DB?
Disable account confirm emails when creating users via API
Transforming usernames with SSO
Automatically provision accounts with external SSO provider? (skip Create New Account prompt)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Embed variables in footer
Need help to setup SSO without emails
Programmatically log users out of discourse
How do I remove people from putting names? I have an API system I want in there
How to detect Discourse user on Ghost Blog?
Problem in sso redirection for compose a new pre-filled topic via URL
How to make default avatars and make sure nobody changes there avatar I want to set them an avatar with my API system
How might we better structure #howto?
Is Roblox Login Possible?
Discourse login with whmcs users
2.7.0.beta4: DiscourseConnect, Topic Timer UI revamp, Login Modal UI revamp, and more
Connecting Discourse invites to Marketo emails
Auto assign member to the certain group
Connecting to an external source of avatars?
Changing avatar_url while sso_overrides_avatar is set?
SSO - User Roles or ACLs to differentiate access levels
SSO - User Roles or ACLs to differentiate access levels
Disabling email verification
SSO Isnt working for me
Could Discourse offer a StackExchange-like SSO/Federated login service?
Mandatory username & avatar generation - How can we do this?
Intergrading discoures in to a application
Configure single sign-on (SSO) with WP Discourse and DiscourseConnect
How to connect to an external database running on localhost
Automate User Creation
Login Help - Correct way to login
What happens to my current users after configuring SSO?
SSO groups without completely overriding
JumpCloud LDAP/SSO
Usernames getting modified – numeral “1” being added
Is "partial" SSO possible?
Send an invite to a user but complete their profile programmatically
Magento 2 as SSO Provider?
Discourse SSO Provider doesn't redirect to return_sso_url as user logs in with custom SSO
Force password change after login
SSO and e-mail addresses having a plus sign
Would Discourse meet all of these niche needs to be a video game community forum?
OpenID Connect and SSO
Does `sso overrides groups` work with Oauth2?
Add user to group after purchase
Shibboleth SSO with Discourse
Using discourse forum in a native app (log-in, languages)
Discourse Connect: How implementing Discourse login with an existing database?
Sync group membership with external list of email addresses
Can I use my own Login page instead of discourse's Default login dialog box?
Modify the URL of 'create your account' button to an external site
How to add a custom url text link on the login page
Can discourse delete archived posts automatically and accept registration without email?
SSO is forcibly creating the user as an admin
Onboarding 15k Trial Users/Year: Need Help Streamlining the Process
Is DiscourseConnect available for self-hosted?
Is DiscourseConnect available for self-hosted?
How to Disable Required SSO Email Activation
User avatar selection through API no longer working
Wordpress plugin not redirect to discourse login automatically
Discourse login by cookie token
Custom field in discourseconnect
Logging users in through c++ desktop application
Invite only by email from database
Is it possible to autologin discourse via iframe?
Login w/ Discourse w/o SSO?
Wordpress plugin not redirect to discourse login automatically
Discourse Hosting Limits?
DiscourseConnect always returns "Nonce is incorrect, ..."
Has anyone succeeded in using discourse as sso provider for nextcloud? Share recipe?
SSO in C# .NET App
Intergrate Discourse with keycloak
Allow my application users to login to discourse
Feature: create default user name from email's user portion when using Google OAuth2/SSO
SSO login appears to have stopped working
Is there a way to use both local login and discourseConnect?
Discourse Hosting Limits?
Changing email addresses not working as an Admin
Populating email field on login page
Problem on SSO Login
SSO Broken - The requested URL or resource could not be found
Adding Discourse to existing Ruby on Rails site
Can I use DiscourseConnect along with Discourse Native Registration?
SSO Login with Discourse
Synchronize SSO login state between Discourse and provider
Connection and discourse account creation without going on discourse
Migrate an IPB 3.1 forum to Discourse
Disable DiscourseConnect
How to use Discourse Connect (SSO) to update avatar, username, name?
Label Sets
Unable to setup discourse in my windows 10
Embed Discourse comments on another website via Javascript
How admin user re-logins after using discourse connect sso and custom domain
How to "intercept" first time SSO usages to let users confirm the SSO action and set a username?
How to create a login on my front-end application to a specific Discourse site?
Use Discourse as an identity provider (SSO, DiscourseConnect)
Connect discourse with magento?
Users allowed to see only some categories
Admin status repeatedly revoked
Plugin to integrate Shopify accounts with Discourse
How to do single sign-on with forum program?
Simple login by email via deep links containing a username
How to set language for SSO users
Want to set internal forum on our reactjs member's platform
New instructions for SSO setup? "enable discourse connect" setting is missing
Add a new user via API
Configure GitHub login for Discourse
Use SSO to auto create Discourse login/password after signed up in my SaaS
How can I change the registration URL?
How do I go about making a very customized theme?
Unable to disable SSO via SSH
Is it possible to have an automatically updating link to a user's profile picture? Such as by giving each user one "slot" for an avatar?
SSO broken after rebuild with stable v3.3.3
Using Discourse Connect with a mobile app
Disable DiscourseConnect
Missing anchor links in certain TOC topics?
Integration into custom auth system where emails are not unique?
WP-Discourse not connected and admin email not recognized
How to disable SMTP during installation?
Auto Login to my Discourse site / subdomain
How to Disable activation_reminder email sending?
Extending header buttons
Auth via Discourse Forum
🧩 How to Build an Android App User Community with Discourse? [HeyApks Project]
Postgres doesn't seem to be running when running Discourse locally using Docker
Discourse sso login redirect to localhost:3000, not 4200 (running via docker)
Cross-Discourse Quoting
Is it Possible to Send Encrypted Email and Password in the Authentication Flow?
Nutzung von Nextcloud aus Discourse heraus
Inherited forum with old Discourse Connect Config and Looking for Some Guidance
Merging user accounts
Understanding PII storage in Discourse
Auto-provisioning user accounts when SSO is enabled
REQUEST: Highly Effective Age Assurance (OneID Phone No. Age Verification) Integration
Intergrate Discourse with keycloak
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
How can I configure Single Sign On for our App to the Discourse Community Forum
Auto-assign random, anonymous usernames
Communities using discourse SSO for their in-app community experience
Login to Discourse with custom Oauth2 provider
Can I log into multiple instances of discourse simultaneously?
Upgraded last night and login button no longer works
SSO with Roles translating to Groups
Redirect login possible?
How to disable SSO via SSH
Connect Multiple WP Sites To 1 Discourse Installation?
What is the procedure to obtain CAS between my website and my discourse instance?
Problem logging in using SSO plugin
PAID: Create Open Source SSO plugin to auth with Wild Apricot
Trouble connecting drupal and discourse
About the idea: IDENTITY = EMAIL
About the idea: IDENTITY = EMAIL
Consequences of not validating email addresses
SSO and Restricted Groups
Questions about Discourse on Digital Ocean
Require users to join at least one group at sign-up
Use the same user database and login credentials in multiple discourse instances
How to connect my (existing) User Database?
User group sync with drupal
Options with SSO with another custom application
Issues in Integrating SSO in Discourse
How to implement Discourse with an already built Rails project
Updating SSO documentation
Configuring SSO to Work With SocialEngine
Updating SSO documentation
Discourse view file update does not reflect in browser
Discourse view file update does not reflect in browser
Trying to set up SSO
Discourse doesn't re-verify an address changed by SSO
Discourse doesn't re-verify an address changed by SSO
SSO and Discourse Consulting
Changing the unique key to identify users
Setting the user title(group?) based on the information that is coming from the sso payload
Advice needed for tailoring Discourse to my organisation
Primary and Discourse Site Integrations
Automatic Table of Contents generation
Questions Regarding Account Authentication Methods
Redirect all users who click on domain.com/signup to a different page
Poll Result Breakdown
Cant update email via API - invalid_access error
Disabling all emails except those registration related?
Can't get avatar overrides to work over SSO
Conflicting email addresses, giving admins more power to resolve issues
Which Discourse hosting tier should I choose?
New users via API if allow new unchecked
How to change login settings without being logged in?
Data explorer query to list the longest "estimated read time" topics?
Create user in discourse by redirecting from another site
HMAC-256 example on Official SSO page
Add links to meta.discourse.org instructions inside admin
How to configure the SSO Authorization URL via config (without using the admin panel)
TeamAndro exploring a migration from phpBB
DiscourseConnect payload hash encoding mismatch
Disabling SSO in development environment
Getting signed data from the server

Hola, me cuesta encontrarlo, pero ¿qué protocolo utiliza esto? ¿Asumo oauth2? Los parámetros no parecen coincidir y recibo un error del proveedor que parece aceptar un parámetro sso=? ¡Ayuda!

Gracias

DiscourseConnect es la implementación de SSO de Discourse. No utiliza un protocolo estándar.

Si no te importa mirar código PHP, hay un ejemplo de implementación aquí: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

Sí, eso no va a funcionar. Si tienes un proveedor OAuth2 que te gustaría usar para autenticar usuarios, echa un vistazo al plugin Discourse OAuth2 Basic.

1 me gusta

Gracias @simon. ¿El código PHP también es un proveedor y no un consumidor? También vi un proveedor OIDC que podría funcionar y también un proveedor “intermediario” en el área de plugins.

Si el proveedor SSO no es estándar, ¿para quién/qué está destinado si no funciona bien con otros?

¡Gracias de nuevo!

El código al que enlacé es para usar WordPress como proveedor de autenticación para Discourse.

El plugin de WordPress también permite que WordPress se use como cliente de DiscourseConnect: wp-discourse/lib/sso-client at main · discourse/wp-discourse · GitHub.

No estoy seguro de cuál fue la motivación para agregar una implementación SSO personalizada a Discourse. Supongo que hubo un caso de negocio para ello.

Un beneficio que proporciona es que permite que un sitio externo se integre estrechamente con Discourse. Por ejemplo, todos los atributos de usuario enumerados aquí se pueden sincronizar con Discourse durante el proceso de autenticación: discourse/lib/discourse_connect_base.rb at 7b89fdead98606d4f47ceb0a1d240d0f6e5f589e · discourse/discourse · GitHub.

También permite que se utilicen sitios que no están configurados para ser proveedores OAuth2 u OpenID Connect para autenticar usuarios en Discourse.

La desventaja es que requiere agregar algo de código personalizado al sitio proveedor de autenticación.

1 me gusta

Hola, tengo curiosidad sobre los problemas de no verificar las direcciones de correo electrónico en un sitio externo que proporciona SSO. ¿Es solo que permite el spam automatizado? ¿O hay otras consideraciones? ¿Por qué no se recomienda que Discourse maneje la verificación de correo electrónico si el sitio externo no lo hace?

Gracias por cualquier información adicional.

El peor escenario que conozco requiere estas condiciones:

  • las direcciones de correo electrónico no están verificadas en el sitio externo
  • require_activation=true no está configurado en la carga útil de SSO
  • existen cuentas en el sitio de Discourse que no tienen un SingleSignOnRecord asociado con ellas (el propietario de la cuenta nunca ha iniciado sesión en Discourse con SSO)

En ese caso, alguien podría registrarse en el sitio externo utilizando la dirección de correo electrónico de un usuario de Discourse que nunca ha iniciado sesión con SSO. Esto permitiría que la cuenta no verificada del sitio externo se apodere de la cuenta de Discourse que utiliza la misma dirección de correo electrónico. Esto sería especialmente preocupante si se tratara de una cuenta de administrador en Discourse.

Sí se recomienda que Discourse maneje la verificación de correo electrónico si el sitio externo no lo hace:

Sin embargo, hay un par de razones por las que es mejor manejar la verificación de correo electrónico en el sitio externo:

  • obligar a los usuarios a recibir el correo electrónico de confirmación de Discourse añade algo de fricción cuando los usuarios intentan iniciar sesión en Discourse por primera vez. (En realidad, esa fricción tiene que ocurrir en algún lugar, ya sea en el lado de Discourse o en el lado del sitio externo).
  • Discourse no emparejará las cuentas de Discourse existentes con los inicios de sesión externos basándose en la dirección de correo electrónico si require_activation está configurado como true en la carga útil de SSO. Esto es un problema si habilitas DiscourseConnect después de que se hayan creado algunas cuentas en Discourse registrándose con nombre de usuario/contraseña. También es un problema si por alguna razón necesitas eliminar entradas de SingleSignOnRecord en Discourse. Discourse no creará automáticamente nuevas entradas de SingleSignOnRecord cuando los usuarios intenten volver a iniciar sesión en Discourse.
4 Me gusta

Gracias, @simon, ¡eso es muy útil!

Hola, tengo una pregunta sobre el campo groups en la carga útil SSO.

¿Se anularán también los grupos automatizados (como administradores, moderadores y niveles de confianza)? ¿O se conservarán?

¡No! Suponiendo que la descripción de esa configuración sea correcta, solo afectará a los grupos manuales.

Sabes qué… no vi la palabra “manual” en la descripción. Suena prometedor para mi caso de uso, lo intentaré y te informaré.

1 me gusta

Cuando leí esto, pensé que se suponía que debía generar la firma directamente a partir de la carga útil codificada en base64. No me di cuenta de que necesitas generarla a partir de los bytes UTF-8. ¿Se podría aclarar esto?

He estado jugando con DiscourseConnect - la documentación es genial, gracias.
Sin embargo, he encontrado algunos obstáculos sobre los que espero ayuda/aclaración.

Queremos que los usuarios puedan iniciar sesión en Wordpress usando su inicio de sesión de Discourse (eso funciona bien :)) - sin embargo.

  • ¿Es posible crear un usuario de Wordpress a través del registro de Discourse (cuando un usuario crea una cuenta de usuario de Discourse, se crea automáticamente una cuenta/perfil de Wordpress para ellos para que puedan iniciar sesión en Wordpress)?

  • ¿Es posible sincronizar los grupos de usuarios de Wordpress y los grupos de Discourse?
    Si un usuario tiene una cuenta de usuario tanto en Wordpress como en Discourse, DiscourseConnect puede unirlas, pero no otorga a la cuenta de Wordpress los grupos de usuarios de los grupos de Discourse del mismo nombre, y viceversa (y ¿qué pasa si los grupos no tienen el mismo nombre? ¿Cómo puedo decirle a DiscourseConnect que otorgue el Grupo de Usuarios ‘Grupo de Pruebas’ cuando el usuario tiene el Grupo de Discourse ‘Grupo para Probar Cosas’?

¿Qué me estoy perdiendo?

No sé la respuesta, pero…

Ten cuidado con eso. Es algo ilegal y se considera una mala práctica (fuera de los propietarios del sitio, por supuesto :smirking_face:) porque sucedería sin el consentimiento y conocimiento del usuario, y al mismo tiempo los datos se trasladarían a otro lugar.

Claro, eso está en una zona gris y, básicamente, por ejemplo, Google lo está haciendo.

Pero… ¿por qué? Limita el inicio de sesión solo a Discourse SSO en el lado de WordPress y redirige a los usuarios a Discourse para la creación de cuentas y eso es todo. Pero, por lo que sé, no puedes sincronizar cuentas de usuario automáticamente de inmediato. Y, ¿por qué lo harías, porque con SSO sucede cuando un usuario lo necesita?

En nuestro escenario (como organización de membresía)

  • Wordpress se utiliza para gestionar suscripciones, comprar artículos en la tienda de Wordpress, y usamos Grupos de Usuarios para gestionar lo que un miembro puede hacer en la organización
  • Discourse es nuestro foro/comunidad en línea y usamos Grupos para controlar a qué áreas de Discourse puede acceder un usuario)

Actualmente, un nuevo miembro necesita configurar una cuenta de Wordpress (y configurar su suscripción, etc.) y también configurar una cuenta de Discourse, y los Grupos de Usuarios-Grupos de Discourse se gestionan/sincronizan manualmente.

Estoy intentando encontrar una solución donde un nuevo usuario configure una sola vez para crear ambas cuentas, y los Grupos de Usuarios-Grupos de Discourse se sincronicen automáticamente; estoy seguro de que puedo resolver la sincronización de grupos con APIs, etc. Es la configuración de cuentas de usuario múltiple lo que intento resolver/evitar.

Parece que lo que estás haciendo es usar Discourse como el proveedor SSO para WordPress. Ese enfoque se describe aquí: Usar Discourse como proveedor de identidad (SSO, DiscourseConnect). El plugin de Discourse para WordPress tiene opciones para usar WordPress como proveedor SSO para Discourse, o para usar Discourse como proveedor de identidad para WordPress. Usar el mismo nombre para ambos enfoques genera cierta confusión.

Me inclinaría a usar WordPress como el proveedor de identidad para este caso. Con ese enfoque, los usuarios crearán cuentas en tu sitio de WordPress y luego iniciarán sesión en Discourse con sus credenciales de WordPress. Una cosa a tener en cuenta con este enfoque es que significa que los usuarios solo podrán iniciar sesión en Discourse a través de WordPress, no será posible crear una cuenta de Discourse sin tener ya una cuenta de WordPress. Creo que esa es la configuración apropiada al integrar Discourse con un sitio de membresía de WordPress.

Cuando WordPress se utiliza como proveedor de identidad para Discourse, hay un par de funciones de utilidad que son útiles para establecer las membresías de grupo de Discourse de un usuario basándose en su actividad en WordPress. Esas funciones se describen aquí: Gestionar membresías de grupo en Discourse con WP Discourse SSO.

Volviendo a tu pregunta original:

Ha pasado un tiempo desde que miré el código del cliente DiscourseConnect del plugin de WordPress, pero creo que lo que estás pidiendo es más o menos la forma en que se espera que funcione ese código. Si un usuario tiene una cuenta de Discourse, solo necesita hacer clic en el enlace “Iniciar sesión a través de Discourse” en WordPress y se creará una cuenta para él.

Esto sería técnicamente posible al usar WordPress como Cliente de DiscourseConnect, pero a menos que algo haya cambiado, no podrás usar los métodos add_user_to_discourse_group y remove_user_from_discourse_group que se describen en la documentación que enlacé. Necesitarías hacer algo como configurar un Webhook de Discourse que se activara cuando un usuario se agregara a un grupo de Discourse, luego agregar algo de código en WordPress para procesar ese webhook. Para sincronizar grupos de WordPress a Discourse, necesitarías hacer una llamada a la API de Discourse para actualizar los grupos de un usuario cuando hubiera un cambio en WordPress. Por lo tanto, algo que sería bastante fácil de lograr si usas WordPress como proveedor de DiscourseConnect podría ser algo complicado si usas WordPress como cliente de DiscourseConnect.

1 me gusta

Excepto si se utiliza el inicio de sesión personalizado, como suele ser la situación con WooCommerce/membresías/LLM que muestran ese botón y obligan a usar solo Discourse SSO como proveedor no se está haciendo de forma predeterminada y necesita algo de trabajo personalizado.

Hay un par de problemas posibles, uno relacionado con el almacenamiento en caché y otro relacionado con las redirecciones de inicio de sesión que añaden algunos complementos. Cualquiera que tenga problemas debería preguntar sobre ellos en la categoría Support > WordPress. Suelen resolverse fácilmente.

Se me olvidó por completo informar: De hecho, funciona exactamente como se describe, solo los grupos manuales se ven afectados.

Hola @simon,

Creo que realmente necesito ayuda con la respuesta 404 de mi POC de esta función SSO. He estado trabajando en este problema durante todo el día, pero todavía no puedo averiguar cuál es el problema. Pude:

  1. Habilitar discourse_connect
  2. Establecer discourse_connect_url en https:/ /localhost:4200/login
  3. Secreto de discourse-connect: 20’s (1) 1111111111111111111 para simplificarlo

Luego, en la página de inicio de sesión de mi aplicación Angular, envié esta solicitud siguiendo el código:


pero obtuve la respuesta 404 no encontrada.

Para mi entendimiento, al enviar una solicitud POST al endpoint admin/users/sync_sso, si el usuario no existía en Discourse, debería crear un nuevo usuario basándose en user_id y email, luego el resultado devuelto debería ser un objeto de usuario, no un objeto vacío con código de estado 404.
También revisé el registro y no proporcionó ninguna información relacionada para esta respuesta fallida.

¡Gracias de antemano!