OAuth2 csrf_detected con la funzionalità 'Connetti' di Discord

Ciao! Ho un disperato bisogno di aiuto per capire questo errore:


Passaggi per riprodurre:
Quando un utente fa clic sul pulsante “Connetti” di Discord nelle Preferenze,


reindirizza correttamente l’utente alla pagina di autorizzazione di Discord.

Tuttavia, dopo aver fatto clic sul pulsante Autorizza, l’utente viene reindirizzato e incontra questo messaggio sul nostro forum:
image
e l’errore in cima a questo argomento viene visualizzato nei log dell’amministratore.


Sento di aver letto e provato tutto per risolvere questo problema, ma continua a succedere. Mi sono assicurato che le impostazioni del sito Client ID e Secret di Discord fossero corrette.
Ho anche verificato che l’URI avesse la sintassi corretta (basandomi su alcuni argomenti correlati che ho visto):

Qualsiasi suggerimento? Sono disposto a provare qualsiasi cosa, anche se non sei sicuro che funzionerà :laughing:

Qualche idea? Sto ancora lottando con questo :confused:

Penso (?) di aver ristretto il campo a un problema di nginx e/o di caching? Ci dovrebbero essere elementi specifici per l’autenticazione o specifici per CSRF definiti in discourse.conf che potremmo star perdendo?

@merefield, @david, @sam - scusate per le notifiche ma vedo i vostri nomi in molte delle vecchie discussioni relative al csrf in passato. Avete qualche raccomandazione in merito? Con l’autenticazione Discord che è parte integrante di discourse, non so cosa potrebbe causare questo.

Apprezzo tutto l’aiuto in anticipo, grazie :smiling_face:

Dobbiamo violare uno di questi?

Non riesco ancora a trovare uno schema. A volte funziona e mi connette correttamente, ma altre volte mi viene presentata la pagina csrf.
Al momento, sospetto maggiormente dell’ultimo controllo della condizione in verified_request?.
Ci sono modi per verificare facilmente se (valid_request_origin? && any_authenticity_token_valid?) restituisce true?

Mi scuso per la mancanza di informazioni debuggabili, ma penso di essere riuscito a trovare (dolorosamente) quello che credo sia il problema. Non sono ancora sicuro di quale sia la soluzione, quindi continuate a leggere :kissing_heart:


Le immagini qui sotto mostrano un’istanza consecutiva in cui sono riuscito a collegare con successo il mio account, ho aggiornato/provato di nuovo e ho colpito senza successo la pagina “csrf detected”. Ero in una finestra di navigazione in incognito e non ho fatto/cambiato letteralmente nulla tra il collegamento riuscito e il fallimento del csrf. Ecco cosa ho scoperto:

Quindi questa prima immagine mostra il cookie _forum_session che corrisponde nelle intestazioni delle richieste 1 e 2, il che ha portato a un collegamento riuscito.

Tuttavia, dopo aver ricaricato la pagina e riprovato (e non essere riuscito a connettermi), potete vedere che la mia ricerca sul lato sinistro mostra solo 1 occorrenza del cookie _forum_session in un’intestazione di richiesta quando è risultata in un fallimento.

tl;dr: Sono abbastanza sicuro che il problema derivi dal cookie forum_session nell’intestazione della richiesta discord?reconnect e poi dall’intestazione della richiesta di callback? successiva che non corrisponde. Cosa potrebbe causare la loro differenza?

Ok, penso che ci stiamo avvicinando.

Quindi in questa immagine qui sotto, puoi vedere una richiesta POST di aggiornamento che avviene direttamente dopo la richiesta POST discord?reconnect.


E, puntualmente, sta impostando il cookie _forum_session che causa la mancata corrispondenza come ho descritto sopra.

Se controllo un’istanza di connessione riuscita (sotto), puoi vedere che l’aggiornamento si verifica solo prima della richiesta POST discord?reconnect.

Ciò fa sì che il cookie _forum_session corrisponda e che l’account si connetta con successo senza il problema csrf.

Come posso impedire che quell’aggiornamento si verifichi dopo che l’utente ha iniziato il processo di connessione?

@FerrariFlunker scusa per la lenta risposta, ma non ho avuto modo di esaminare questo problema, sarebbe fantastico se il team principale potesse farlo.

Se può consolare, credo di poter riprodurre lo stesso errore:

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

Nessun problema @merefield, apprezzo la risposta!

Stai riscontrando questo errore nel tuo ambiente? Penso che in ogni caso, questo errore debba essere esaminato dal team principale. Sono più di 2 settimane che sto cercando di risolvere questo problema e non ho ancora trovato una risposta :confused:

1 Mi Piace

Ottimo lavoro di indagine! Questo tipo di race condition potrebbe certamente causare i problemi che stai riscontrando.

Detto questo, non abbiamo ricevuto altre segnalazioni di questo problema, quindi sembra che debba essere qualcosa di specifico del tuo sito/configurazione. Quali plugin hai installato sul sito? Puoi aprire la chiamata “update” e vedere quale payload viene inviato?

3 Mi Piace

Dopo aver esaminato le chiamate di aggiornamento, penso che tu abbia ragione. Ecco alcuni screenshot di richieste di “aggiornamento” confermate che hanno causato errori csrf.

Vedo uno schema che coinvolge cdn :face_with_monocle: Cosa potrebbe essere mal configurato con quello? Fammi sapere se hai ancora bisogno di un elenco dei nostri plugin, ho solo pensato di salvare questa risposta da +1 immagine :smile:

1 Mi Piace

Ho un aggiornamento entusiasmante! Pochi giorni fa, ho esaminato più attentamente il payload di “aggiornamento” e sono riuscito ad associare questo:

a uno dei nostri plugin! :partying_face: :expressionless: :smile:
Dopo aver disabilitato il plugin, ulteriori test e un lancio riuscito della funzionalità correlata alla community… penso di poter dire con sicurezza che abbiamo trovato il colpevole.

Quindi questo plugin si è rivelato essere il problema: GitHub - discourse/discourse-chat: Chat inside Discourse

Ripensandoci, ha senso perché questo sarebbe il colpevole: il plugin è ancora contrassegnato come sperimentale e non è destinato a siti di produzione. :sweat:

Dato che sono più di 3 settimane che sto diagnosticando questo problema e devo tornare in carreggiata con gli altri progetti della nostra community :face_with_spiral_eyes:, sfortunatamente non sarò in grado di aiutare a trovare la soluzione per il plugin discourse-chat.

Se qualcuno dovesse implementare una correzione per il plugin, prenderemmo in considerazione (molto probabilmente :smile:) la riattivazione del plugin sul nostro sito, ma per ora abbiamo bisogno di una funzionalità di associazione account Connect stabile.

Grazie ancora a tutti coloro che hanno aiutato nella diagnosi! :+1:

2 Mi Piace

Grazie per la super dettagliata indagine @FerrariFlunker!

Ho appena creato una PR per una correzione nel core di Discourse:

Il motivo per cui è stato corretto dopo aver rimosso il plugin di chat è che la chat fa un uso intensivo di questa API ‘PresenceChannel’, e quindi è molto più probabile che si verifichi il problema. Non credo che saranno necessarie modifiche nella chat.

4 Mi Piace

Dovrebbe risolvere lo stesso problema con i login di Google? I miei utenti su una delle mie istanze in cui stavamo testando il plugin di chat lo adoravano, ma ha interrotto i login di Google con lo stesso errore dei login di Discord.

5 Mi Piace

Sì, questa correzione si applicherà a tutti i diversi tipi di accesso :+1:

3 Mi Piace