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 :
Falco
(Falco)
Novembre 13, 2019, 8:14
8
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é).
Falco
(Falco)
Novembre 13, 2019, 8:26
10
Votre forum fonctionne-t-il en HTTPS ?
Falco
(Falco)
Novembre 13, 2019, 8:40
12
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 ?
david
(David Taylor)
Novembre 20, 2019, 8:41
16
La seule utilisation d’Excon dans le plugin oauth2 se trouve ici :
# 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
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.
david
(David Taylor)
Novembre 21, 2019, 3:56
18
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 :
Réponse
Si la requête réussit, la réponse du serveur retournera un JSON contenant le jeton d’accès de l’utilisateur.
{"access_token":"101177"}
Ce jeton d’accès correspond simplement à l’ID du compte NeonCRM de l’utilisateur.
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>'
david
(David Taylor)
Novembre 21, 2019, 4:31
20
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.
david
(David Taylor)
Novembre 21, 2019, 4:32
22
Cette erreur a-t-elle une trace d’appel (backtrace) associée ?
david:
Pour confirmer, cette erreur provient de votre site de production ? . J’ai essayé de me connecter à celui-ci, et de mon côté, il semble que l’état 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 ?
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'
david
(David Taylor)
Novembre 21, 2019, 5:10
25
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