Connessione DC SSO fallita rallenta l'admin con timeout

Ho configurato Discourse Connect SSO utilizzando il plugin ufficiale, in modo che i miei utenti WP accedano a Discourse senza registrarsi nuovamente lì. Funziona tutto bene, tranne il fatto che ogni singola richiesta alla dashboard di WP (area amministratore) viene rallentata di 10 secondi a causa di un timeout che ho scoperto solo tramite il plugin Query Monitor.

https://{indirizzo-nostro-forum}/site.json cURL error 28: Connection timeout after 10001 ms

WPDiscourse\Admin\MetaBox->discourse_request()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:516
WPDiscourse\Admin\MetaBox->get_discourse_categories()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:273
WPDiscourse\Admin\MetaBox->setup_options()
wp-content/plugins/wp-discourse/admin/meta-box.php:49
do_action(‘admin_init’)
wp-includes/plugin.php:517

Plugin: wp-discourse

Anche se funzionasse, perché è necessaria una chiamata del genere in primo luogo? Come posso disattivarla?

Il forum e il sito sono su server separati. Non c’è Cloudflare. SSL è letsencrypt. Non aveva questo problema in staging. Mi sono spostato sul live, ho creato una nuova chiave API e un segreto, cercando di risolvere questo problema ma non ha funzionato.

Il plugin dice Non sei connesso a Discourse. Verifica che le impostazioni di connessione siano corrette. Se il problema persiste, abilita i log di connessione e controlla i Log. … ma lo sono, poiché gli utenti sono in grado di accedere al forum senza problemi semplicemente cliccando su un link contenente il suo indirizzo.

I log in WP dicono:

[2024-10-31 10:54:47] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}

Pensavo che quella strana cosa di sicurezza di WP la bloccasse, quindi ho aggiunto questo ma senza successo:

add_filter('http_request_host_is_external', [$this, 'mark_discourse_api_url_external'], 10, 3);

function mark_discourse_api_url_external($is_external, $host, $url)
{
	if ($host === "{indirizzo-nostro-forum}") {
		return true; // Permetti la richiesta indicando che l'host È esterno
	}

	return $is_external;
}

Ciao @Firsh,

Quella chiamata a /site.json è necessaria affinché il plugin di WordPress recuperi informazioni sul tuo Discourse.

Ciò significa che non sei connesso correttamente e, anche se le cose sembrano funzionare, non farei affidamento sul fatto che continuino a funzionare.

Questo è ciò su cui dobbiamo concentrarci. Potresti condividere che tipo di chiave hai creato? Come riferimento, assicurati di seguire le linee guida a riguardo qui:

2 Mi Piace

Non credo sia la chiave. Ho provato in precedenza con la chiave del sito di staging e quella nuova dice “mai usata”. Quando provo una chiamata di test wp_remote_request alla homepage del mio forum, anche questa va in timeout. L’ho impostata per “ogni utente” e “globale”.

Sì, ma perché ogni volta su ogni pagina di amministrazione non correlata? Una volta quando necessario sarebbe sufficiente. Ho rintracciato da dove proviene ed è function get_discourse_categories() e questo è codificato in modo fisso in add_action( 'admin_init', array( $this, 'setup_options' ) ); Non voglio che il mio WP conosca le categorie sul forum, non sto utilizzando alcuna funzionalità di pubblicazione/commento, ho solo bisogno del login, che funziona già.

Ho anche effettuato una richiesta alla homepage del forum utilizzando wp_remote_request() e anche questa va in timeout. Altri siti casuali sono accessibili.

Capisco che ritieni non necessaria la richiesta a /site.json, tuttavia senza una connessione riuscita al tuo Discourse, il plugin Wordpress non funzionerà in modo affidabile per te, quindi dovremmo comunque capire perché non funziona.

  1. Riesci a pensare a qualche altra differenza tra il tuo ambiente di staging e quello di produzione?
  2. Potresti condividere i file meta del log di WP Discourse delle tue istanze di staging e di produzione?
  3. Potresti condividere i link alle tue istanze Wordpress e Discourse?
1 Mi Piace

Sì, ma è un sito e un forum privato solo per i membri in ungherese.

Forum: https://forum.intelligensbefektetok.hu/
Sito: https://intelligensbefektetok.hu/

La mia staging era una copia esatta creata manualmente, sebbene in esecuzione in Docker in una VM. La produzione non è gestita da me e non ho idea di che tipo di hosting sia, ma non abbiamo mai avuto problemi ed era abbastanza veloce prima di questo.

Ho provato ora:

  • L’opzione sslverify = false nella funzione discourse_request
  • E ho creato un CNAME (alias) su Cloudflare su un altro dei miei domini per puntare al server del forum dietro le quinte (“migliore” SSL e il server è diverso, per escludere un qualche tipo di restrizione di loopback nel firewall del server del sito live): https://ibkforum.stateofbliss.us ma va in timeout allo stesso modo, mentre i test delle richieste dalla staging funzionano bene. Reindirizza al sito principale quando non si è loggati.
  • Sto usando questo piccolo plugin per controllare le richieste: https://wphive.com/plugins/wp-remote-request-check/

object(WP_Error)#5757 (3) { [“errors”]=> array(1) { [“http_request_failed”]=> array(1) { [0]=> string(59) “cURL error 28: Connection timed out after 5000 milliseconds” } } [“error_data”]=> array(0) { } [“additional_data”:protected]=> array(0) { } }

  • Altri siti WP; questo forum; il sito live quando effettua una richiesta a se stesso, funzionano tutti bene.

Log di WP della staging:

[2024-10-31 13:09:08] connection.INFO: check_connection_status.valid_scopes  
[2024-10-31 13:09:19] connection.INFO: check_connection_status.successful_connection  
[2024-10-31 13:09:19] connection.INFO: check_connection_status.valid_scopes

I log del sito live sono gli stessi del mio OP:

[2024-10-31 13:12:32] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}

Quando caricato direttamente nel browser, questo funziona:
https://forum.intelligensbefektetok.hu/site.json

Grazie per l’aiuto, comunque.

Intendi la produzione di Wordpress o la produzione di Discourse? È possibile che ci sia qualcosa nel tuo ambiente di produzione Discourse che esegue reindirizzamenti e/o modifica (o rimuove) gli header nelle richieste?

Se potessi condividere quei file meta di entrambe le istanze, aiuterebbe. Fai clic su “Visualizza meta” nel pannello di amministrazione “Log”.

Questo è probabilmente il problema fondamentale. Se il tuo Wordpress non è in grado di vedere affatto il tuo Discourse, la connessione non funzionerà. Se riesci a testare facilmente questa connettività, continua a farlo mentre apporti qualsiasi modifica allo strato di rete del tuo forum finché non ottieni un 403 (cioè non autorizzato).

Il mio istinto dice che si tratta di un problema a livello di rete, forse un reindirizzamento o un firewall.

Non esiste un ambiente di staging per Discourse, entrambi i siti utilizzano lo stesso Discourse live (stessi ID utente, ecc.). Ho chiesto in un altro thread e dovrebbe andare bene. Lo strato di rete del forum è molto semplice, ospitato su Hetzner, la cosa ufficiale di Docker in un VPS, e il forum è stato a malapena utilizzato o personalizzato oltre ad alcuni aspetti visivi. Non sono a conoscenza di impostazioni che potrebbero impedirne l’accesso. Ho creato un ticket presso l’azienda di hosting di WP per vedere se riescono a capire perché le connessioni falliscono, dato che sono più preoccupato per la loro insolita configurazione.

Ciò che mi interessa è che il semplice fatto che il forum possa raggiungere WP (non il contrario) sia “sufficiente” per un SSO funzionante. Ad eccezione del logout degli utenti dal forum.

Logs (il sito live scarica uno ZIP da 0 byte).

Sì, aspetterei prima l’esito di questo, altrimenti potremmo girare a vuoto qui. La domanda di base è perché una richiesta WP standard non riesce a raggiungere il tuo forum.