Errore nell'utilizzo del plugin discourse-oauth2-basic con NeonCRM

Sto cercando di configurare il plugin discourse-oauth2-basic in modo che i nostri utenti possano accedere al nostro forum Discourse utilizzando le credenziali del loro account create e archiviate tramite NeonCRM.

Un tecnico del supporto di NeonCRM mi ha spiegato che posso creare manualmente l’URL di autorizzazione utilizzando questo formato:

https://{{Org ID}}.z2systems.com/np/oauth/auth?response_type=code&client_id={{Client ID}}&redirect_uri={{Redirect URL}}

In Discourse, ho impostato i seguenti parametri per il plugin:

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

Quindi ho creato manualmente questo URL (che ho oscurato):

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

Quando inserisco questo URL in un browser, visualizzo una pagina di Discourse con il seguente messaggio:

E i miei log riportano:

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

Perché?

Quindi, se uso questo URL invece:

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

(Ho rimosso la parte di callback alla fine del mio redirect_uri)

In realtà arrivo alla pagina di accesso di NeonCRM, dopo di che inserisco le mie credenziali di utente di prova e effettuo il login. Vengo quindi reindirizzato a MY-FORUM.COM. Ma una volta lì non sono affatto loggato. Se faccio clic sul pulsante “Accedi” in alto nella pagina e poi sul pulsante grigio “Accedi con OAuth2”, si apre una nuova finestra con il seguente messaggio:

E nei miei log compaiono due errori:

ArgumentError (URI non valido: )

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

e

Impossibile gestire l'eccezione nel middleware dell'app di eccezione: URI non valido:

Questo redirect_uri è errato. Devi impostarlo correttamente affinché il flusso funzioni.

Nella documentazione del plugin, è la prima cosa da fare nella configurazione di base.

NeonCRM documenta anche come impostarlo nella loro documentazione.

Grazie @Falco!

Ho provato a impostare il redirect_uri su:

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

Ma non ha funzionato, vedi il mio post originale (che ho appena modificato per renderlo meno confuso, scusa se non l’hai notato).

Il tuo forum è in esecuzione su HTTPS?

Sì, è @Falco.

https://forum.efao.ca/

Hai abilitato l’impostazione force_https?

@Falco, ho trovato le istruzioni per abilitare force_https e l’ho impostato su true.

Tuttavia, ricevo ancora lo stesso errore.

Ho integrato il widget che NeonCRM consiglia di utilizzare nella parte superiore del forum (così puoi provarlo tu stesso, se lo desideri) all’indirizzo

https://forum.efao.ca/

Quando utilizzo il widget, ottengo lo stesso risultato del mio post originale.

(oauth2_basic) Errore di autenticazione! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | Rilevato CSRF

Qualcuno? @david o @Falco?

L’unico luogo in cui utilizziamo Excon nel plugin oauth2 è qui:

Cosa hai impostato per oauth2_user_json_url? Sospetto che sia vuoto. Se è così, dovresti anche disabilitare oauth2_fetch_user_details, in modo che Discourse non tenti di contattare un URL vuoto.

@david, è effettivamente vuoto.

Non so cosa impostare come oauth2_user_json_url. Purtroppo, ho esaurito la fortuna nel cercare di ottenere aiuto da NeonCRM per risolvere questo problema tramite il loro supporto tecnico.

Se provo a disabilitarlo, ricevo un messaggio che mi dice di dover impostare oauth2 callback user id path, ma come ho detto sopra, non so quale valore debba essere.

Non ho un’installazione di NeonCRM con cui testarlo, ma penso che impostarlo su access_token dovrebbe funzionare. Puoi provare?

Dalla documentazione collegata da Falco sopra:

Stesso errore:

(oauth2_basic) Autenticazione fallita! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | Rilevato CSRF

Backtrace:

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

Interessante… lo stack trace suggerisce che l’errore proviene da questa parte della libreria OAuth2. Ciò significa che il parametro state non viene confrontato correttamente.

Per confermare, questo errore proviene dal tuo sito di produzione? Ho provato ad accedere, e dal mio lato sembra che lo stato venga passato correttamente.

Questo suggerisce un problema lato server. Come è ospitato il tuo sito? Hai seguito la nostra procedura standard?

Anche @david, e non so se sia correlato, ma ho anche questa voce separata nei nostri log:

Eccezione del job: SSL_connect restituito=1 errno=0 stato=errore: verifica del certificato fallita (certificato autofirmato)

Utilizziamo Let’sEncrypt per il nostro certificato SSL.

Quell’errore ha un backtrace allegato?

Sì, forum.efao.ca è il nostro sito di produzione. Siamo ospitati su Digital Ocean e l’installazione è stata eseguita seguendo la procedura 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'

Temo che senza accesso al server non ci sia molto altro che io possa fare per diagnosticare il problema. Abbiamo molte persone che utilizzano il plugin oauth2 senza problemi, quindi penso che si tratti di un problema di configurazione da qualche parte. L’unica altra cosa che potrebbe aiutare è aggiornare all’ultima versione di Discourse, invece di utilizzare il ramo stabile.

Forse qualcun altro nella community si farà avanti, ma se no potresti avere successo chiedendo aiuto in Marketplace