| Resumen | Discourse OpenID Connect permite utilizar un proveedor OpenID Connect como proveedor de autenticación para Discourse. | |
| 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 enhttps://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 alend_session_endpointdespué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) Elpost_logout_redirect_urique 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 laerror_reasonde 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:
-
Configura tu proveedor de identidad para que devuelva una matriz de grupos en una de las reclamaciones. Debe ser una matriz de cadenas.
-
Establece
openid_connect_groups_claimen 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. -
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.
-
Ve a OpenID Connect | Sign in with Google | Google for Developers y sigue las instrucciones para obtener las credenciales de OAuth.
-
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) -
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)
-
-
¡Listo! El botón “Iniciar sesión con OpenID Connect” ahora iniciará sesión usando Google
. 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
-
Ve a https://developer.yahoo.com/apps y crea una nueva aplicación
-
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) -
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
-
Guarda la aplicación
-
En la configuración de OIDC de Discourse, establece el documento de descubrimiento en
https://login.yahoo.com/.well-known/openid-configuration -
Ingresa el ID de cliente y el secreto de Yahoo
-
Habilita el plugin OIDC
AWS Cognito
- Ve a Cognito y selecciona o crea un nuevo grupo de usuarios.
- Define una aplicación en Clientes de aplicaciones.
- Deja todo por defecto, pero cambia la configuración de flujos de autenticación para seleccionar solo ALLOW_REFRESH_TOKEN_AUTH.
- Ve a la configuración del cliente de la aplicación y selecciona la nueva aplicación.
- Cambia la URL de devolución de llamada a https://tusitio.ejemplo.com/auth/oidc/callback.
- Marca solo el flujo de concesión de código de autorización entre “Flujos OAuth permitidos”.
- Marca todos los ámbitos necesarios (yo tengo todos marcados).
Okta
-
Configura Discourse con el ID de cliente y el secreto de tu aplicación Okta
-
Establece la URL del documento de descubrimiento en
https://{tu-app}.okta.com/.well-known/openid-configuration -
En Discourse, establece
openid connect authorize scopeenopenid email
¿Alojado por nosotros? Este plugin está disponible en nuestros planes Business y Enterprise. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion
¿Necesitas automatizar el registro de usuarios? Consulta Auto-provisioning user accounts when SSO is enabled
