Erreur lors de l'utilisation du plugin discourse-oauth2-basic avec NeonCRM

Je tente de configurer le plugin discourse-oauth2-basic afin que nos utilisateurs puissent se connecter à notre forum Discourse en utilisant leurs identifiants créés et stockés via NeonCRM.

Un technicien du support de NeonCRM m’a expliqué que je pouvais créer manuellement l’URL d’autorisation en utilisant ce format :

https://{{ID de l’organisation}}.z2systems.com/np/oauth/auth?response_type=code&client_id={{ID du client}}&redirect_uri={{URL de redirection}}

Dans Discourse, j’ai configuré les paramètres suivants pour le plugin :

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

J’ai donc créé manuellement cette URL (que j’ai censurée) :

https://MON-ID-NEON.z2systems.com/np/oauth/auth?response_type=code&client_id=MON-ID-CLIENT&redirect_uri=https://MON-FORUM.COM/auth/oauth2_basic/callback

Lorsque j’entre cette URL dans un navigateur, j’obtiens une page Discourse affichant le message suivant :

Et mes journaux indiquent :

(oauth2_basic) Échec de l'authentification ! csrf_detected : OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF détecté

Pourquoi ?

Donc, si j’utilise cette URL à la place :

https://MY-NEON-ID.z2systems.com/np/oauth/auth?response_type=code&client_id=MY-CLIENT-ID&redirect_uri=https://MY-FORUM.COM/

(J’ai supprimé la partie de rappel à la fin de mon redirect_uri)

J’arrive effectivement sur la page de connexion de NeonCRM, après quoi je saisis mes identifiants utilisateur de test et me connecte. Je suis ensuite redirigé vers MY-FORUM.COM. Mais une fois arrivé là, je ne suis pas du tout connecté. Si je clique sur le bouton « Connexion » en haut de la page, puis sur le bouton gris « Se connecter avec OAuth2 », une nouvelle fenêtre s’ouvre avec le message suivant :

Et deux erreurs apparaissent dans mes journaux :

ArgumentError (URI invalide : )

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.64.0/lib/excon.rb:126:in `new’

et

Échec de la gestion de l'exception dans le middleware de l'application d'exception : URI invalide :

Ce redirect_uri est incorrect. Vous devez le configurer correctement pour que le flux fonctionne.

Dans la documentation du plugin, c’est la première chose mentionnée dans la configuration de base.

NeonCRM documente également comment le configurer dans leur documentation.

Merci @Falco !

J’ai bien essayé de définir l’URI de redirection sur :

https://MY-FORUM.COM/auth/oauth2_basic/callback

Mais cela n’a pas fonctionné. Consultez mon message d’origine (que je viens d’éditer pour le rendre moins confus, désolé si vous l’avez manqué).

Votre forum fonctionne-t-il en HTTPS ?

Oui, c’est @Falco.

https://forum.efao.ca/

Avez-vous activé le paramètre force_https ?

@Falco, j’ai trouvé les instructions pour activer force_https et je l’ai défini sur true.

Je rencontre toujours la même erreur, cependant.

J’ai intégré le widget que NeonCRM recommande d’utiliser en haut du forum (vous pouvez donc l’essayer vous-même si vous le souhaitez) à l’adresse suivante :

https://forum.efao.ca/

Lorsque j’utilise le widget, j’obtiens le même résultat que dans mon message initial.

(oauth2_basic) Échec de l'authentification ! csrf_detected : OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF détecté

Quelqu’un ? @david ou @Falco ?

La seule utilisation d’Excon dans le plugin oauth2 se trouve ici :

Quelle valeur avez-vous définie pour oauth2_user_json_url ? Je soupçonne qu’elle est vide. Si c’est le cas, vous devriez également désactiver oauth2_fetch_user_details afin que Discourse ne tente pas de contacter une URL vide.

@david, c’est effectivement vide.

Je ne sais pas quoi définir pour oauth2_user_json_url. Malheureusement, je n’ai plus de chance en essayant d’obtenir de l’aide de NeonCRM pour résoudre ce problème via leur support technique.

Si j’essaie de le désactiver, je reçois un message m’indiquant que je dois définir oauth2 callback user id path, mais comme je l’ai mentionné plus haut, je ne sais pas quelle valeur utiliser.

Je n’ai pas d’installation NeonCRM pour le tester, mais je pense que le définir sur access_token devrait fonctionner. Peux-tu essayer ?

D’après la documentation à laquelle Falco a lié ci-dessus :

Même erreur :

(oauth2_basic) Échec de l'authentification ! csrf_detected : OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF détecté

Pile d’appels :

 /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>'

Intéressant… la trace d’appel suggère que l’erreur provient de cette partie de la bibliothèque OAuth2. Cela signifie que le paramètre state n’est pas correctement vérifié.

Pour confirmer, cette erreur provient-elle de votre site de production ? J’ai essayé de me connecter, et de mon côté, il semble que le state soit transmis correctement.

Cela suggère un problème côté serveur. Comment votre site est-il hébergé ? Avez-vous suivi notre procédure standard ?

Aussi @david, et je ne sais pas si cela est lié, mais j’ai également cette entrée séparée dans nos journaux :

Exception de tâche : SSL_connect returned=1 errno=0 state=error: échec de la vérification du certificat (certificat auto-signé)

Nous utilisons Let’sEncrypt pour notre certificat SSL.

Cette erreur a-t-elle une trace d’appel (backtrace) associée ?

Oui, forum.efao.ca est notre site de production. Nous sommes hébergés sur Digital Ocean et l’installation a été effectuée en suivant la procédure standard.

/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'

Je crains de ne pas pouvoir faire grand-chose de plus pour diagnostiquer ce problème sans accès au serveur. Nous avons beaucoup d’utilisateurs qui utilisent le plugin oauth2 sans aucun problème, donc je pense que cela doit provenir d’un problème de configuration quelque part. La seule autre chose qui pourrait aider est de passer à la dernière version de Discourse, plutôt que d’utiliser la branche stable.

Peut-être que quelqu’un d’autre dans la communauté se manifestera, mais sinon, vous pourriez avoir du succès en demandant de l’aide dans Marketplace