Error al usar el plugin discourse-oauth2-basic con NeonCRM

Creo que empezaré borrando nuestro Droplet actual y configurándolo de nuevo desde cero, ya que este Docker se configuró hace unos años. Informaré cuando lo haya hecho y probado.

Suena como un buen plan. Para la mayoría de las comunidades, recomendamos mantener la rama predeterminada tests-passed, ya que te ofrece las últimas y mejores funciones de Discourse y correcciones de errores. Ha habido muchos cambios en la autenticación desde el último lanzamiento estable, por lo que es posible que encuentres que las cosas comienzan a funcionar por sí solas.

@david, hoy he tomado el tiempo de intentarlo de nuevo. Ahora estoy usando una instalación fresca de Discourse (la más reciente en stable-passed, como sugeriste).

He configurado OAuth2 usando el plugin, igual que antes, con la siguiente configuración:

oauth2 client id: MI-CLIENT-ID
oauth2 client secret: MI-CLIENT-SECRET
oauth2 authorize url: https://MI-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token

Si utilizo la URL formateada manualmente, obtengo esto (que es nuevo):

La autorización se agotó o has cambiado de navegador. Por favor, inténtalo de nuevo.

Y el error habitual en los registros:

(oauth2_basic) ¡Fallo de autenticación! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado

Por otro lado, si uso el botón OAuth2 en la ventana de inicio de sesión de Discourse, obtengo:

Vaya

El software que impulsa este foro de discusión encontró un problema inesperado. Pedimos disculpas por las molestias.

Se registró información detallada sobre el error y se generó una notificación automática. Lo revisaremos.

También obtengo los siguientes errores registrados en /logs:

ArgumentError (URI inválido: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'

y

Error al manejar la excepción en el middleware de la aplicación de excepción: URI inválido:

@david Probé tu sugerencia anterior sobre configurar oauth2_user_json_url y desactivar oauth2_fetch_user_details, y obtuve varios errores (nuevos) al intentarlo:

ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’

Failed to handle exception in exception app middleware : PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).

Y, por supuesto, lo habitual:

(oauth2_basic) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

Sin embargo, noté en este último (CSRF detected) que en la pestaña de entorno dice:

hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca

¿Es normal que el hostname no coincida con el nombre de HTTP_HOST? ¿Podría ser esa la razón por la que obtengo el error de CSRF?

Hola Denis,

¿Alguna suerte?
Yo tengo el mismo error:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: el valor nulo en la columna “provider_uid” viola la restricción de no nulo

¿Cómo lo solucionaste?

Gracias,
Beam

Denis y yo hemos determinado que NeonCRM no se ajusta realmente a la especificación oauth2… están enviando el user_id dentro de la variable access_token, y no se puede utilizar como un token de acceso real.

Por lo tanto, necesitas desactivar oauth2_fetch_user_details y establecer oauth2_callback_user_id_path en token (no access_token, porque la biblioteca ruby de oauth2 lo cambia de nombre para uso interno).

Con esto, debería funcionar, pero no hay forma de obtener el correo electrónico o el nombre del usuario.

¡Hola Denis,

Estoy usando Mattermost, así que se comporta de manera diferente.
Sin embargo, tu información me llevó a revisar más a fondo la configuración y ya lo tengo funcionando, ¡gracias!!

Aquí están mis configuraciones para Mattermost como proveedor OAuth2 en Discourse:

Configuraciones en texto para motores de búsqueda:

oauth2 client id: <client id from mattermost oauth2 provider setup>
oauth2 client secret: <client secret from mattermost oauth2 provider setup>
oauth2 authorize url: https://chat.animalrebellion.org/oauth/authorize
oauth2 token url: https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: MARCADO
oauth2 user json url: https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: MARCADO

En el lado de Mattermost, la URL de devolución de llamada está configurada como:
https://base.animalrebellion.org/auth/oauth2_basic/callback

Aún me gustaría ver cómo unir first_name y last_name en el “jason name path” como full_name, pero puedo conformarme con usar simplemente la propiedad “username” o “first_name”.

Espero que esto ayude.

¡Saludos!
Beam

Enlaces a recursos:
Enlace al plugin: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Enlace sobre cómo instalar el plugin de Discourse: Install plugins on a self-hosted site

¡Qué bueno que te haya funcionado, @Beam!