Спорадические проблемы с входом через SSO из-за истекшего nonce

Мы используем DiscourseSSO, и время от времени пользователи сталкиваются с проблемами входа (похожими на описанные здесь: Sporadic issue wp-discourse/SSO: Nonce has already expired). Я пытался отладить это, добавив дополнительное логирование, и, к счастью, смог воспроизвести проблему через несколько дней. Чтобы прояснить: вход работает в большинстве случаев, но эпизодически (возможно, в течение 5 минут в день) пользователи сталкиваются с ошибками входа.

У нас настроена структура с подпапками в кластере из нескольких узлов, используется внешняя общая база данных и Redis, если это имеет значение. Есть два сценария сбоя:

  1. Истёк срок действия nonce
    Когда пользователя перенаправляют на /session/sso_login, контроллер SessionController не получает session_id в сессии и, следовательно, не может найти nonce. Я добавил логирование сессии (Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")), и оно вывело пустую сессию. Я проверил, что браузер отправляет cookie-файл “_forum_session”, полученный в предыдущем запросе, и этот cookie регистрируется на сервере при логировании в SessionController (Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")).

  2. Вход завершается, но на экране появляется ошибка входа
    Когда пользователя перенаправляют на /session/sso_login, контроллер SessionController успешно проверяет данные SSO и выполняет вход пользователя (в логах я вижу Verbose SSO log: User was logged on user5). Однако при перенаправлении пользователя на /forums/latest на экране появляется ошибка. Я заметил, что в рабочем сценарии это действие очищает/возвращает пустым cookie “cn”, а в сценарии сбоев оно просто обновляет и возвращает cookie “_t”. Моё предположение: этот сценарий также может быть связан с отсутствием данных сессии.

Если подождать около 5 минут и попробовать снова, всё начинает работать нормально.

Я не проверял, сталкиваются ли с этой проблемой все пользователи, обращающиеся к сайту в этот момент, но мне устно сообщили, что на нашем экземпляре с ней столкнулись несколько пользователей.

Привет!

Что вы используете для настройки подпапки? Если перед Discourse у вас стоит какой-либо веб-файрвол, стоит проверить наличие проблем с кэшированием. По нашему опыту, это первое, что нужно исключить.

Спасибо за ваш ответ, Леонардо. Мы используем nginx в качестве основного шлюза, который пересылает URL-адреса на основе пути в nginx внутри контейнера Discourse.

Я добавил эти две строки в начало session_controller.rb/sso и 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

Для первого сценария сбоя, упомянутого выше, я получил следующее для /sso (на узле 1 многоузлового кластера):

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

А следующее для /sso_login (на узле 2 многоузлового кластера):

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

На сервере Redis я вижу ключ 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"

Меня беспокоит то, что поле Session пустое для /sso_login.}

Напоминаю о теме, если у кого-то есть предложения.

Сайт случайно не публичный? Это помогло бы нам отладить его онлайн.

Да, это так. Я отправлю адрес в личном сообщении.

Обновление: отправлено в личном сообщении

Вход в систему перестаёт работать для всех пользователей одновременно? Или это происходит в разное время для каждого пользователя?

Тот факт, что всё начинает работать снова через некоторое время, заставляет задуматься о наличии кэширования. Выполняет ли кэширование конфигурация вашего NGINX или какой-либо другой промежуточный прокси (например, Cloudflare)?

Это приводит к сбоям у всех пользователей в течение этого короткого промежутка времени. Сначала я предположил, что проблема в промежуточном узле, который искажает данные, но когда я записал куки из контроллера (как описано выше), я смог их увидеть. Есть ли что-то ещё, что мне стоит проверить?

Снова пингую тему.