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:
Falco
(Falco)
13 Novembre 2019, 8:14pm
8
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).
Falco
(Falco)
13 Novembre 2019, 8:26pm
10
Il tuo forum è in esecuzione su HTTPS?
Falco
(Falco)
13 Novembre 2019, 8:40pm
12
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 ?
david
(David Taylor)
20 Novembre 2019, 8:41am
16
L’unico luogo in cui utilizziamo Excon nel plugin oauth2 è qui:
# 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
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.
david
(David Taylor)
21 Novembre 2019, 3:56pm
18
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:
Risposta
La risposta del server, in caso di successo, restituirà in formato JSON il token di accesso dell’utente.
{"access_token":"101177"}
Questo token di accesso corrisponde semplicemente all’ID dell’account NeonCRM dell’utente.
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>'
david
(David Taylor)
21 Novembre 2019, 4:31pm
20
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.
david
(David Taylor)
21 Novembre 2019, 4:32pm
22
Quell’errore ha un backtrace allegato?
david:
Per confermare, questo errore proviene dal tuo sito di produzione? . Ho provato ad accedere da lì e, dal mio lato, sembra che lo stato venga trasmesso correttamente.
Ciò suggerisce un problema lato server. Come è ospitato il tuo sito? Hai seguito la nostra procedura standard ?
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'
david
(David Taylor)
21 Novembre 2019, 5:10pm
25
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