Sporadici problemi di accesso DiscourseSSO con nonce scaduto

Utilizziamo DiscourseSSO e sporadicamente gli utenti riscontrano problemi di accesso (simili a Sporadic issue wp-discourse/SSO: Nonce has already expired). Ho cercato di risolvere il problema aggiungendo un po’ di logging e fortunatamente ho riscontrato il problema dopo un paio di giorni. Per essere chiari, l’accesso funziona la maggior parte delle volte, solo che sporadicamente (forse per 5 minuti al giorno) gli utenti riscontrano problemi di accesso.

Utilizziamo la configurazione in sottocartella su un cluster multi-nodo, utilizzando un database condiviso esterno e Redis, se ciò fa differenza. Ci sono due scenari di fallimento:

  1. Nonce scaduto
    Quando l’utente viene reindirizzato a /session/sso_login, SessionController non riceve session_id nella sessione e quindi non è in grado di cercare il nonce. Ho provato a registrare la sessione (Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")) e ha stampato una sessione vuota. Ho verificato che il browser stia inviando il cookie “*_forum_session*” come ricevuto nella richiesta precedente e il cookie viene registrato sul server se il logging in SessionController (Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")).

  2. L’accesso viene completato ma l’utente visualizza un errore di accesso sullo schermo
    Quando l’utente viene reindirizzato a /session/sso_login, SessionController è in grado di verificare i dati SSO e registrare l’utente (vedo Verbose SSO log: User was logged on user5 nei log). Ma quando reindirizza l’utente a /forums/latest, l’utente visualizza un errore sullo schermo. Ho notato che nel flusso di lavoro funzionante questa azione cancella/restituisce un cookie “*cn*” vuoto, ma nello scenario di fallimento, aggiorna e restituisce solo il cookie “*_t*”. La mia ipotesi è che anche questo scenario possa essere correlato alla mancanza di dati di sessione.

Se aspettiamo circa 5 minuti e riproviamo, tutto ricomincia a funzionare correttamente.

Non ho testato se tutti gli utenti che accedono al sito in quel momento riscontrano il problema o meno, ma mi è stato detto aneddoticamente che più utenti lo hanno riscontrato una volta sulla nostra istanza.

Ciao!

Cosa usi per la configurazione della sottocartella? Se hai un qualche tipo di firewall per applicazioni web davanti a Discourse, potrebbe valere la pena verificare eventuali problemi di caching. Per nostra esperienza, questa è la prima cosa da escludere.

Grazie per la tua risposta Leonardo. Utilizziamo nginx come nostro gateway principale che invia URL basati sul percorso all’nginx all’interno del container Discourse.

Ho aggiunto queste due righe all’inizio di session_controller.rb/sso e session_controller.rb/sso_login

    if SiteSetting.verbose_discourse_connect_logging
      Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")
      Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")
    end

Per il primo scenario di errore menzionato sopra, ho ottenuto quanto segue per /sso (sul nodo1 del cluster multinode)

Verbose SSO log: Cookies cn=12,_forum_session=ZjBveGorRVN1bU0zeGRKVHZtWUZDamUxTUJSUkJHUDZDaHhLMkh3U0lXMlpCYS9PTnpJWEovcTlZVDFTSTJuNkVNUE9NdlNvVWlidStIdk9SeTlRYzZ5YVp0N0pXdmhnTldlaSt4d1o3TC9mUm1nSUhsOUtiWFRyVGZBYkJLRHRRR0lFZmM0RkVxLzl0V2JEODR4NGMxQUJvOGhpdVc0c2JsdDFESHo2TWxJPS0tRXZTL0FHZlM1Yy9QVWJkc2xaaTYvUT09--36fa626c698a401db1e7f13276ee6bfde16dea77,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session 
Verbose SSO log: Setting nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336

e quanto segue per /sso_login (sul nodo2 del cluster multinode)

Verbose SSO log: Cookies cn=12,_forum_session=WFRkNThYYUZwUnlOQjF5VHdUZGRUWE1UNUx2a3Z5ZlJCOGl0VFRRUlF2bm5vQUQzMWdaUVZVUnJkNmdIUjlRTE52d1B5MXJnV0svWkJMRWZrOU5XellvV0IzMTBScERwM0lzT3VIUWc2SEppb2xpTlkxaFpuc1dvU2d4SkdZRXFYYjJzakRQTXFmS2lYTlhxVEd5Zi9nQ3dZQnVUR1pDSndScGZhcVNJOW1ZPS0tNFduSE1YRDk5cWdMRXNsWnBzbDVhZz09--00ab1b89ff4cf05c9f3f3ed71eec9c0c4557f032,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session 
Verbose SSO log: Checking nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336
Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired

Sul server Redis, vedo la chiave nonce

redis:6379[3]> KEYS "*NONCE*"
1) "default:3aa05452fdd8fd4a93481eb8afa90f3aSSO_NONCE_8199453c67e347124ecb2e57e5738336"
2) "default:21639ca4bef85f68c1d72824e3a49bd6SSO_NONCE_7d54c965762e6861799f62ef7c5cfa60"
3) "default:_CACHE:USED_SSO_NONCE_86886a948684ff110d4830919d4e6de5"
4) "default:_CACHE:USED_SSO_NONCE_d04fdbf483fe61129a6fcc54087cb4e4"
5) "default:f7c87c11539908b30f9e307ef05d3f18SSO_NONCE_90a6a6997b7bd5d75eac1ac0cfc6dee2"

La mia preoccupazione è che Session sia vuoto per /sso_login.

Segnalo l’argomento, se qualcuno ha suggerimenti.

il sito è pubblico per caso? Sarebbe utile se potessimo eseguirne il debug online.

2 Mi Piace

Sì, lo è, invierò l’indirizzo in un messaggio privato.

Aggiornamento: inviato tramite messaggio privato

1 Mi Piace

Il login si interrompe per tutti gli utenti contemporaneamente? O succede in momenti diversi per ciascun utente?

Il fatto che ricominci a funzionare dopo un po’ mi fa pensare che ci sia una cache coinvolta. La tua configurazione NGINX, o qualsiasi altro proxy intermedio (ad esempio Cloudflare), esegue qualche tipo di caching?

Si interrompe per tutti gli utenti per quella breve durata. La mia prima ipotesi è stata un nodo intermedio che interferiva con i dati, ma quando ho registrato i cookie dal controller (come spiegato sopra) sono stato in grado di vedere i cookie. C’è qualcos’altro che dovrei controllare?

Ri-sollecito l’argomento.

3 post sono stati divisi in un nuovo argomento: WordPress DiscourseConnect client - nonce scaduto

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.