Discourse OpenID Connect (OIDC)

:discourse2: Resumen Discourse OpenID Connect permite utilizar un proveedor OpenID Connect como proveedor de autenticación para Discourse.
:open_book: Guía de instalación Este plugin viene incluido en el núcleo de Discourse. No es necesario instalarlo por separado.

Funcionalidades

El plugin tiene como objetivo proporcionar una implementación mínima de la especificación. En concreto, admite el “Flujo de código de autorización”. Para empezar, sigue las instrucciones de instalación del plugin o contacta con tu proveedor de alojamiento.

Nuestro plugin oauth2-basic puede utilizarse para conectarse a algunos proveedores openid-connect (OpenID Connect se basa en OAuth2). Sin embargo, este plugin debería requerir mucha menos configuración manual y puede hacer uso del “token de identidad” JWT si no está disponible una API JSON.

La configuración se realiza automáticamente utilizando un documento de descubrimiento OpenID Connect. Según la especificación, este debería estar ubicado en <dominio del emisor>/.well-known/openid-configuration, pero Discourse admite cualquier ruta para permitir implementaciones que no cumplan la norma (por ejemplo, Azure B2C). El documento de descubrimiento se almacena en caché durante 10 minutos para mejorar el rendimiento en sitios con mucho tráfico.

Si el documento de descubrimiento incluye un parámetro userinfo_endpoint, el plugin lo utilizará para recopilar metadatos del usuario. Si no, el plugin extraerá los metadatos del id_token (un JWT) proporcionado por el punto final del token. El plugin NO verifica la autenticidad de la firma JWT, ya que esto aumentaría significativamente la complejidad. Esta decisión está respaldada por la especificación:

Si el token de identidad se recibe mediante comunicación directa entre el cliente y el punto final del token (que es el caso en este flujo), la validación del servidor TLS PUEDE utilizarse para validar el emisor en lugar de verificar la firma del token.

Para los proveedores de identidad que admiten autorización sin secreto utilizando el “Flujo de código de autorización con clave de prueba para el intercambio de código”, PKCE debe estar habilitado y la configuración client_secret puede omitirse.

Configuración

Opciones de configuración básica

  • openid_connect_enabled: Habilitar la autenticación OpenID Connect

  • openid_connect_discovery_document: URL del documento de descubrimiento OpenID Connect. Normalmente ubicado en https://tu.dominio/.well-known/openid-configuration

  • openid_connect_client_id: ID de cliente OpenID Connect

  • openid_connect_client_secret: Secreto de cliente OpenID Connect

  • openid connect rp initiated logout: Redirigir al usuario al end_session_endpoint después del cierre de sesión. Debe ser admitido por tu proveedor de identidad e incluido en el documento de descubrimiento.

  • openid connect rp initiated logout redirect: (opcional) El post_logout_redirect_uri que se pasará al punto final de cierre de sesión. Si se proporciona, debe estar registrado con el proveedor de identidad.

  • openid_connect_authorize_scope: Los ámbitos enviados al punto final de autorización. Esto debe incluir ‘openid’

  • openid_connect_use_pkce: Habilitar la clave de prueba para el intercambio de código (PKCE) para la autenticación OpenID Connect.

  • openid_connect_verbose_logging: Registrar información detallada de autenticación openid-connect en /logs. Mantén esto deshabilitado durante el uso normal.

Opciones de configuración avanzada

  • openid_connect_token_scope: Los ámbitos enviados al solicitar el punto final del token. La especificación oficial no lo requiere.

  • openid_connect_error_redirects: Si la error_reason de la devolución de llamada contiene el primer parámetro, el usuario será redirigido a la URL en el segundo parámetro. Se utiliza para implementaciones inusuales que envían errores en respuesta a la entrada del usuario (por ejemplo, Azure B2C)

  • openid_connect_allow_association_change: Permitir que los usuarios desconecten y reconecten sus cuentas de Discourse del proveedor OpenID Connect

  • openid_connect_groups_claim: El nombre de la reclamación en la respuesta OIDC[1] que contiene los grupos del usuario como una matriz de cadenas. Déjalo en blanco para deshabilitar la sincronización de grupos. Consulta Sincronización de grupos a continuación.

  • openid_connect_user_field_mappings: Mapeos de reclamaciones OIDC[2] que se almacenarán en los campos de usuario de Discourse. Los campos de usuario se identifican por su ID numérico, que se puede encontrar en la URL al editarlos a través del panel de administración.

Sincronización de grupos

El plugin puede sincronizar automáticamente las membresías de grupos desde tu proveedor OpenID Connect con los grupos de Discourse. En cada inicio de sesión, el plugin leerá la reclamación configurada del token OIDC y actualizará las membresías de grupos del usuario en consecuencia. Para habilitar la sincronización de grupos:

  1. Configura tu proveedor de identidad para que devuelva una matriz de grupos en una de las reclamaciones. Debe ser una matriz de cadenas.

  2. Establece openid_connect_groups_claim en el nombre de la reclamación en el token OIDC que contiene los grupos del usuario (por ejemplo, cognito:groups). Una vez establecido, comenzará a sincronizar la información con el sistema de “Grupos asociados” de Discourse.

  3. Encuentra el grupo de Discourse que deseas vincular. Ve a “Configuración” → “Membresía” → “Automático” y luego elige los Grupos asociados para vincular. Esta lista desplegable se completa con información del proveedor de identidad, por lo que al menos un miembro del grupo debe haber iniciado sesión para que aparezca una opción.

Configuración de ejemplo

Aquí configuraremos el plugin openid-connect para conectarse al proveedor OpenID Connect de Google. Esto replica una funcionalidad que ya existe en el núcleo de Discourse, pero sirve como un ejemplo accesible.

  1. Ve a OpenID Connect  |  Sign in with Google  |  Google for Developers y sigue las instrucciones para obtener las credenciales de OAuth.

  2. En la misma página, sigue las instrucciones para agregar una URI de redirección. Debería ser https://<tu_foro>/auth/oidc/callback (sin una barra al final)

  3. Ve a la configuración de tu sitio de Discourse y busca “openid_connect”

    • openid connect enabled: [x]

    • openid connect discovery document: https://accounts.google.com/.well-known/openid-configuration

    • openid connect client id: <id-de-cliente>

    • openid connect client secret: <secreto-de-cliente>

    • openid connect authorize scope: openid email (con un espacio en medio)

  4. ¡Listo! El botón “Iniciar sesión con OpenID Connect” ahora iniciará sesión usando Google :tada:. Estos mismos pasos se pueden aplicar a otros proveedores con cambios muy mínimos.

Depuración

Además de la configuración verbose_logging descrita anteriormente, puedes acceder a datos sobre las asociaciones OIDC utilizando el plugin data-explorer:

SELECT user_id, provider_name, provider_uid
FROM user_associated_accounts
WHERE provider_name = 'oidc'

O en la consola de rails:

User.find_by_username("david").user_associated_accounts.where(provider_name: 'oidc')

Notas específicas del proveedor

Siéntete libre de actualizar esto si encuentras cualquier peculiaridad específica del proveedor relacionada con esta integración:

Entra ID (anteriormente Azure AD)

Agrega el ámbito email y asegúrate de estar utilizando el documento de configuración del punto final de versión 2. Por ejemplo

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
Azure B2C

Los detalles de la URL del documento de descubrimiento se pueden encontrar aquí: Web sign in with OpenID Connect - Azure AD B2C | Microsoft Learn

Para que funcionen los correos electrónicos:

Yahoo
  1. Ve a https://developer.yahoo.com/apps y crea una nueva aplicación

  2. Ingresa el nombre de la aplicación y establece el dominio de devolución de llamada en el dominio de tu foro (por ejemplo, meta.discourse.org)

  3. En Permisos de API, elige Perfiles: Lectura/escritura pública y privada. Esta es la única forma que conozco para obtener la dirección de correo electrónico del usuario

  4. Guarda la aplicación

  5. En la configuración de OIDC de Discourse, establece el documento de descubrimiento en

    https://login.yahoo.com/.well-known/openid-configuration
    
  6. Ingresa el ID de cliente y el secreto de Yahoo

  7. Habilita el plugin OIDC

AWS Cognito
  1. Ve a Cognito y selecciona o crea un nuevo grupo de usuarios.
  2. Define una aplicación en Clientes de aplicaciones.
  3. Deja todo por defecto, pero cambia la configuración de flujos de autenticación para seleccionar solo ALLOW_REFRESH_TOKEN_AUTH.
  4. Ve a la configuración del cliente de la aplicación y selecciona la nueva aplicación.
  5. Cambia la URL de devolución de llamada a https://tusitio.ejemplo.com/auth/oidc/callback.
  6. Marca solo el flujo de concesión de código de autorización entre “Flujos OAuth permitidos”.
  7. Marca todos los ámbitos necesarios (yo tengo todos marcados).
Okta
  1. Configura Discourse con el ID de cliente y el secreto de tu aplicación Okta

  2. Establece la URL del documento de descubrimiento en

    https://{tu-app}.okta.com/.well-known/openid-configuration
    
  3. En Discourse, establece openid connect authorize scope en openid email

:discourse2: ¿Alojado por nosotros? Este plugin está disponible en nuestros planes Business y Enterprise. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion

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


  1. token o payload de userinfo ↩︎

  2. desde el token o el payload de userinfo ↩︎

52 Me gusta
Native SSO with Azure AD
How to setup okta authentication with discourse
Discourse Login using external API
OpenIdAuthenticator plugin fails
Sign in to Discourse using ORCID
Discourse, Keycloak, SAML vs OAuth
OpenID Connect support in selfhosted Discourse instance
How can you connect firebase to discourse?
Keycloak SSO and logout issue
Tutorial for OpenID Connect / Azure AD
OpenID connect plugin
Azure OpenID Connect Authentication Plugin
Installing own gem in plugin
SSO Login page not showing up
Enabling Okta for employees only through OpenID Connect Authentication Plugin
Is "partial" SSO possible?
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
Official support for Microsoft Azure AD?
CodeBerg support
Availability of OpenID Connect in hosted plans
Can we use the default atlassian id to login to discourse
OpenIdAuthenticator plugin fails
Intergrate Discourse with keycloak
IndieAuth login
Intergrate Discourse with keycloak
Map oidc fields to custom user fields
CSRF problem in development with 'Discourse OpenID Connect' plug-in
Azure B2C SSO to Discourse?
User (patron) getting authorization error message
Memberstack + Webflow + Discourse OpenID Connect
How can add 2 or more discovery documents?
Memberstack + Webflow + Discourse OpenID Connect
Azure AD Authentication and Creation of User Account
Possible to create a Sign in with Ghost plugin for Discourse?
Custom Login Flow: AWS Cognito SSO (via Passwordless Signin) - Is this possible?
Account already in discourse
AAD integration with Discourse
Having trouble setting up AWS Cognito passwordless login
Discourse ID fails to activate on my instance
Restrict Office 365 Login to certain Group
OpenID Connect Plugin not creating new users with AWS Cognito
OIDC users not associating with existing Discourse users
Bundling more popular plugins with Discourse core
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
Availability of OpenID Connect in hosted plans
How to configure the OIDC to set the Username as the email account name or a username like value returned from my auth providers?
Managing group membership via authentication
Failed to bootstrap due to out of memory killer
OAuth connection of discourse
Auto-provisioning user accounts when SSO is enabled
Anyone have a working AWS Cognito configuration w/ ouath2, openid or sso?
SAML Plugin on Self Hosted Discourse
Can I include website analytics in trust data?
Using OpenID Connect with User Flows in Azure B2C
ADFS Authentication
How to set-up Discourse with Atricore Josso CE
Error of Discourse OpenID Connect
How can add 2 or more discovery documents?
./launcher rebuild app fails hard 'bundle exec rake db:migrate' possible issue with github/master repo removal of auth/oath2_authenticator
Removing Yahoo login from Core, and deprecating OpenID 2.0
SSO with TownNews CMS
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
OpenID with line.biz - email in JWT , missing in userinfo