Estoy intentando configurar el plugin discourse-oauth2-basic para que nuestros usuarios puedan iniciar sesión en nuestro foro de Discourse utilizando las credenciales de su cuenta creadas y almacenadas a través de NeonCRM.
Un técnico de soporte de NeonCRM me explicó que puedo crear la URL de autorización manualmente utilizando este formato:
https://{{ID de la organización}}.z2systems.com/np/oauth/auth?response_type=code&client_id={{ID del cliente}}&redirect_uri={{URL de redirección}}
En Discourse, configuré los siguientes parámetros para el plugin:
oauth2 client id: MI-ID-DE-CLIENTE
oauth2 client secret: MI-SECRET-DE-CLIENTE
oauth2 authorize url: https://MI-ID-NEON.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token
Así que creé manualmente esta URL (que he censurado):
https://MI-ID-NEON.z2systems.com/np/oauth/auth?response_type=code&client_id=MI-ID-DE-CLIENTE&redirect_uri=https://MI-FORUM.COM/auth/oauth2_basic/callback
Cuando ingreso esta URL en un navegador, obtengo una página de Discourse con el siguiente mensaje:
Y mis registros indican:
(oauth2_basic) ¡Fallo de autenticación! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado
¿Por qué ocurre esto?
Así que si uso esta URL en su lugar:
https://MI-ID-NEON.z2systems.com/np/oauth/auth?response_type=code&client_id=MI-CLIENT-ID&redirect_uri=https://MI-FORUM.COM/
(He eliminado la parte de callback al final de mi redirect_uri)
Realmente llego a la página de inicio de sesión de NeonCRM, después de lo cual ingreso mis credenciales de usuario de prueba e inicio sesión. Luego soy redirigido a MI-FORUM.COM. Pero una vez que estoy allí, no estoy iniciado sesión en absoluto. Si hago clic en el botón “Iniciar sesión” en la parte superior de la página y luego en el botón gris “Iniciar sesión con OAuth2”, se abre una nueva ventana con el siguiente mensaje:
Y aparecen dos errores en mis registros:
ArgumentError (URI no válido: )
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.64.0/lib/excon.rb:126:in `new’
y
Error al manejar la excepción en el middleware de la aplicación de excepciones: URI no válido:
Falco
(Falco)
13 Noviembre, 2019 20:14
8
Este redirect_uri es incorrecto. Necesitas configurarlo correctamente para que el flujo funcione.
En la documentación del plugin, es lo primero que aparece en la configuración básica .
NeonCRM también documenta cómo configurarlo en su documentación
¡Gracias @Falco !
Intenté establecer el redirect_uri en:
https://MI-FORUM.COM/auth/oauth2_basic/callback
Pero eso no funcionó, consulta mi publicación original (acabo de editarla para que fuera menos confusa, disculpa si no la viste).
Falco
(Falco)
13 Noviembre, 2019 20:26
10
¿Tu foro está ejecutándose en HTTPS?
Falco
(Falco)
13 Noviembre, 2019 20:40
12
¿Habilitaste la configuración force_https?
@Falco , encontré instrucciones para habilitar force_https y lo he establecido en true.
Sin embargo, sigo obteniendo el mismo error.
He integrado el widget que NeonCRM sugiere utilizar en la parte superior del foro (para que puedas probarlo si lo deseas) en:
https://forum.efao.ca/
Cuando uso el widget, obtengo el mismo resultado que en mi publicación original.
(oauth2_basic) ¡Error de autenticación! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado
¿Alguien? @david o @Falco ?
david
(David Taylor)
20 Noviembre, 2019 08:41
16
El único lugar donde usamos Excon en el plugin oauth2 es aquí:
# frozen_string_literal: true
# name: discourse-oauth2-basic
# about: Allows users to login to your forum using a basic OAuth2 provider.
# meta_topic_id: 33879
# version: 0.3
# authors: Robin Ward
# url: https://github.com/discourse/discourse-oauth2-basic
enabled_site_setting :oauth2_enabled
require_relative "lib/omniauth/strategies/oauth2_basic"
require_relative "lib/oauth2_faraday_formatter"
require_relative "lib/oauth2_basic_authenticator"
# You should use this register if you want to add custom paths to traverse the user details JSON.
# We'll store the value in the user associated account's extra attribute hash using the full path as the key.
DiscoursePluginRegistry.define_filtered_register :oauth2_basic_additional_json_paths
# After authentication, we'll use this to confirm that the registered json paths are fulfilled, or display an error.
This file has been truncated. show original
¿Qué valor tienes configurado para oauth2_user_json_url? Sospecho que está vacío. Si es así, también deberías desactivar oauth2_fetch_user_details, para que Discourse no intente contactar con una URL vacía.
@david , efectivamente está en blanco.
No sé qué establecer como oauth2_user_json_url. Por desgracia, he agotado la suerte intentando que NeonCRM me ayude a resolver esto a través de su soporte técnico.
Si intento desactivarlo, recibo un mensaje que me indica que necesito establecer oauth2 callback user id path, pero como mencioné anteriormente, no sé qué valor debería tener.
david
(David Taylor)
21 Noviembre, 2019 15:56
18
No tengo una instalación de NeonCRM para probarlo, pero creo que configurarlo en access_token debería funcionar. ¿Puedes intentarlo?
De la documentación que Falco enlazó anteriormente:
Respuesta
La respuesta del servidor, si es exitosa, devolverá en JSON el token de acceso del usuario.
{"access_token":"101177"}
Este token de acceso es simplemente el ID de la cuenta de NeonCRM del usuario.
Mismo error:
(oauth2_basic) ¡Fallo de autenticación! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado
Rastreo de llamada:
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:110:in `report_to_store'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:101:in `add_with_opts'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:52:in `add'
/usr/local/lib/ruby/2.6.0/logger.rb:543:in `error'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-oauth2-1.6.0/lib/omniauth/strategies/oauth2.rb:71:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/builder.rb:64:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:30:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:218:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/cookies.rb:670:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:98:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiler.rb:184:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.0/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:163:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/engine.rb:524:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'
david
(David Taylor)
21 Noviembre, 2019 16:31
20
Interesante… el rastreo de llamadas sugiere que el error proviene de esta parte de la biblioteca OAuth2. Eso significa que el parámetro state no se está emparejando correctamente.
Para confirmar, ¿este error proviene de tu sitio de producción? Intenté iniciar sesión en él y, desde mi perspectiva, parece que el estado se está pasando correctamente.
Esto sugiere algún problema en el lado del servidor. ¿Cómo está alojado tu sitio? ¿Siguió nuestro procedimiento estándar ?
También, @david , y no sé si esto está relacionado, pero también tengo esta entrada separada en nuestros registros:
Excepción del trabajo: SSL_connect returned=1 errno=0 state=error: verificación de certificado fallida (certificado autofirmado)
Usamos Let’sEncrypt para nuestro certificado SSL.
david
(David Taylor)
21 Noviembre, 2019 16:32
22
¿Ese error tiene un backtrace adjunto?
david:
Para confirmar, ¿este error proviene de tu sitio de producción? . Intenté iniciar sesión en él y, desde mi punto de vista, parece que el estado se está transmitiendo correctamente.
Esto sugiere algún problema en el lado del servidor. ¿Cómo está alojado tu sitio? ¿Siguió nuestro procedimiento estándar ?
Sí, forum.efao.ca es nuestro sitio de producción. Estamos alojados en Digital Ocean y se instaló utilizando el procedimiento estándar.
/usr/local/lib/ruby/2.6.0/net/protocol.rb:44:in `connect_nonblock'
/usr/local/lib/ruby/2.6.0/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/lib/ruby/2.6.0/net/pop.rb:553:in `do_start'
/usr/local/lib/ruby/2.6.0/net/pop.rb:531:in `start'
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:43:in `poll_pop3'
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:18:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.0.7/lib/rails_multisite/connection_management.rb:63:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
/var/www/discourse/app/jobs/base.rb:279:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_scheduler-0.11.0/lib/mini_scheduler/manager.rb:83:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_scheduler-0.11.0/lib/mini_scheduler/manager.rb:34:in `block in initialize'
david
(David Taylor)
21 Noviembre, 2019 17:10
25
Me temo que no puedo hacer mucho más para diagnosticar esto sin acceso al servidor. Tenemos a muchas personas utilizando el plugin oauth2 sin problemas, así que creo que esto debe ser un problema de configuración en algún lugar. Lo único más que podría ayudar es actualizar a la última versión de Discourse, en lugar de usar la rama estable.
Quizás alguien más de la comunidad se una a la conversación, pero si no, podrías tener éxito pidiendo ayuda en Marketplace .