Problemas esporádicos de login no DiscourseSSO com nonce expirado

Usamos DiscourseSSO e esporadicamente os usuários encontram problemas de login (semelhante a Sporadic issue wp-discourse/SSO: Nonce has already expired). Eu estava tentando depurar isso adicionando alguns logs extras e, felizmente, encontrei o problema depois de alguns dias. Para ser claro, o login funciona na maioria das vezes, apenas esporadicamente (talvez por 5 minutos por dia) os usuários encontram problemas de login.

Usamos configuração de subpasta em um cluster multi-nó, usando banco de dados compartilhado externo e Redis, se isso fizer alguma diferença. Existem dois cenários de falha:

  1. Nonce expirado
    Quando o usuário é redirecionado para /session/sso_login, o SessionController não obtém o session_id na sessão e, portanto, não consegue localizar o nonce. Tentei registrar a sessão (Rails.logger.warn(\"Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}\")) e ela imprimiu uma sessão vazia. Verifiquei que o navegador está enviando o cookie “*_forum_session*” como recebido na solicitação anterior e o cookie é registrado no servidor se o registro em SessionController (Rails.logger.warn(\"Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}\")).

  2. O login é concluído, mas o usuário recebe um erro de Login na tela
    Quando o usuário é redirecionado para /session/sso_login, o SessionController consegue verificar os dados do SSO e registrar o usuário (vejo Verbose SSO log: User was logged on user5 nos logs). Mas quando ele redireciona o usuário para /forums/latest, o usuário vê um erro na tela. Notei que no fluxo de trabalho funcionando, esta ação limpa/retorna vazio o cookie “*cn*”, mas no cenário de falha, ele apenas atualiza e retorna o cookie “*_t*”. Minha suposição é que este cenário também pode estar relacionado à falta de dados de sessão.

Se esperarmos cerca de 5 minutos e tentarmos novamente, tudo volta a funcionar bem.

Não testei se todos os usuários que acessam o site naquele momento encontram o problema ou não, mas me disseram anonimamente que vários usuários o encontraram uma vez em nossa instância.

Olá!

O que você usa para a configuração de subpasta? Se você tiver algum tipo de firewall de aplicativo da web na frente do Discourse, pode valer a pena verificar problemas de cache. Em nossa experiência, essa é a primeira coisa a descartar.

Obrigado pela sua resposta Leonardo. Usamos o nginx como nosso gateway principal, que envia URLs baseadas em caminhos para o nginx dentro do contêiner Discourse.

Adicionei estas duas linhas no início de 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

Para o primeiro cenário de falha mencionado acima, obtive o seguinte para /sso (no nó1 do 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 o seguinte para /sso_login (no nó2 do 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

No servidor Redis, eu vejo a chave 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"

Minha preocupação é o Session estar em branco para /sso_login.

Tópico sendo sinalizado, se alguém tiver alguma sugestão.

o site está público por acaso? Ajudaria se pudéssemos depurá-lo online.

2 curtidas

Sim, é. Enviarei o endereço em uma mensagem privada.

Atualização: enviado por mensagem privada

1 curtida

O login falha para todos os usuários ao mesmo tempo? Ou acontece em momentos diferentes para cada usuário?

O fato de voltar a funcionar após algum tempo me faz pensar se há algum cache envolvido. Sua configuração do NGINX, ou qualquer outro proxy intermediário (por exemplo, Cloudflare), realiza algum cache?

Ele falha para todos os usuários durante esse curto período. Minha primeira suposição foi que um nó intermediário estivesse interferindo nos dados, mas quando registrei os cookies do controlador (conforme explicado acima), consegui vê-los. Há mais alguma coisa que eu deva verificar?

Reabrindo o tópico.

3 posts foram divididos em um novo tópico: Cliente WordPress DiscourseConnect - nonce expirado

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