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:
-
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(',')}")). -
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 (vedoVerbose SSO log: User was logged on user5nei 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.