OAuth2 csrf_detected com a funcionalidade 'Conectar' do Discord

Olá! Preciso desesperadamente de ajuda para entender este erro:


Passos para reproduzir:
Quando um usuário clica no botão “Conectar” do Discord em Preferências,


ele redireciona corretamente o usuário para a página de autorização do Discord.

No entanto, após clicar no botão Autorizar, o usuário é redirecionado e encontra esta mensagem em nosso fórum:
image
e o erro no topo deste tópico aparece nos logs do administrador.


Sinto que li e tentei de tudo para consertar isso, mas continua acontecendo. Certifiquei-me de que o ID do Cliente e o Segredo do Discord nas configurações do site estão corretos.
Também me certifiquei de que o URI tinha a sintaxe correta (com base em alguns tópicos relacionados que vi):

Alguma sugestão? Estou disposto a tentar qualquer coisa, mesmo que você não tenha certeza se funcionará :laughing:

Alguma ideia? Ainda estou com dificuldades nisso :confused:

Eu acho(?) que reduzi o problema a uma questão de nginx e/ou cache? Deveria haver algo específico de autenticação ou CSRF definido em discourse.conf que possamos estar perdendo?

@merefield, @david, @sam - desculpem pelos pings, mas vejo seus nomes em muitas das discussões mais antigas relacionadas a csrf no passado. Vocês têm alguma recomendação para isso? Com a autenticação do Discord sendo uma parte integrada do discourse, não sei o que poderia estar causando isso.

Agradeço qualquer ajuda antecipadamente, obrigado :smiling_face:

Devemos estar quebrando um destes?

Ainda não consigo encontrar um padrão. Às vezes funciona e me conecta corretamente, mas outras vezes sou recebido com a página csrf.
No momento, suspeito mais da última verificação de condição em verified_request?.
Existem maneiras fáceis de verificar se (valid_request_origin? && any_authenticity_token_valid?) está retornando true?

Peço desculpas pela falta de qualquer informação depurável, mas acho que fui (dolorosamente) capaz de encontrar (pelo menos o que eu acho) o problema. Ainda não tenho certeza de qual é a correção, então por favor, continue lendo :kissing_heart:


As imagens abaixo mostram uma instância consecutiva em que consegui vincular minha conta com sucesso, atualizei/tentei novamente e acertei a página de CSRF detectado sem sucesso. Eu estava em uma janela anônima e fiz/mudei literalmente nada entre a conexão bem-sucedida e a falha de CSRF. Aqui está o que eu encontrei:

Então, esta primeira imagem mostra o cookie _forum_session correspondendo em ambos os cabeçalhos de solicitação 1 e 2, o que resultou em uma conexão bem-sucedida.

No entanto, depois que recarreguei a página e tentei novamente (e falhei em conectar), você pode ver minha pesquisa no lado esquerdo mostrando apenas 1 ocorrência do cookie _forum_session em um cabeçalho de solicitação quando resultou em uma falha.

Resumindo: Tenho quase certeza de que o problema decorre do cookie forum_session no cabeçalho da solicitação discord?reconnect e, em seguida, do cabeçalho da solicitação callback? seguinte não correspondente. O que causaria a diferença entre eles?

Ok, acho que estamos chegando mais perto.

Então, nesta imagem abaixo, você pode ver uma solicitação POST de atualização ocorrendo diretamente após a solicitação POST discord?reconnect.


E, com certeza, está definindo o cookie _forum_session, o que faz com que ele não corresponda, como descrevi acima.

Se eu verificar uma instância de conexão bem-sucedida (abaixo), você pode ver que a atualização ocorre apenas antes da solicitação POST discord?reconnect.

Isso faz com que o cookie _forum_session corresponda e conecte com sucesso a conta sem o problema de csrf.

Como posso impedir que essa atualização ocorra depois que o usuário iniciou o processo de conexão?

@FerrariFlunker desculpe pela resposta lenta, mas não tive chance de olhar isso, seria ótimo se a equipe principal pudesse.

Se servir de consolo, eu consigo reproduzir, acredito, estou recebendo o mesmo erro:

(discord) Falha na autenticação! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado

Sem problemas @merefield, agradeço a resposta!

Você está recebendo esse erro em seu próprio ambiente? Acho que, de qualquer forma, esse erro precisa ser analisado pela equipe principal. Já estou há mais de 2 semanas depurando isso e ainda não encontrei uma resposta :confused:

1 curtida

Boa investigação! Esse tipo de condição de corrida certamente poderia causar os problemas que você está vendo.

Dito isso, não tivemos nenhum outro relato desse problema, então parece que deve ser algo específico do seu site/configuração. Quais plugins você tem instalados no site? Você pode abrir a chamada “update” e ver qual carga útil está sendo enviada?

3 curtidas

Depois de dar uma olhada nas chamadas de atualização, acho que você está certo. Aqui estão algumas capturas de tela de solicitações de ‘atualização’ confirmadas que causaram falhas de csrf.

Estou vendo um padrão envolvendo cdn :face_with_monocle: O que poderia estar mal configurado com isso? Me avise se você ainda precisa de uma lista dos nossos plugins, eu só pensei em salvar esta resposta de +1 imagem :smile:

1 curtida

Tenho uma atualização empolgante! Há alguns dias, dei uma olhada mais de perto na carga útil de ‘atualização’ e acabei associando com sucesso isto:

com um de nossos plugins! :partying_face: :expressionless: :smile:
Depois de desabilitar o plugin, realizar mais testes e lançar com sucesso o recurso relacionado para a comunidade… acho que posso dizer com confiança que encontramos o culpado.

Então, este plugin acabou sendo o causador do problema: GitHub - discourse/discourse-chat: Chat inside Discourse

Em retrospectiva, faz sentido por que este seria o culpado - o plugin ainda está marcado como experimental e não se destina a sites de produção. :sweat:

Como estou há mais de 3 semanas diagnosticando este problema e preciso voltar aos trilhos com os outros projetos de nossa comunidade :face_with_spiral_eyes:, infelizmente não poderei ajudar a encontrar a solução para o plugin discourse-chat.

Se alguém acabar enviando uma correção para o plugin, nós (muito provavelmente :smile:) consideraremos reativar o plugin em nosso site, mas por enquanto precisamos de funcionalidade estável de contas associadas do Connect.

Obrigado novamente a todos que ajudaram no diagnóstico! :+1:

2 curtidas

Obrigado pela investigação super detalhada, @FerrariFlunker!

Acabei de fazer um PR para uma correção no core do Discourse:

O motivo pelo qual foi corrigido após a remoção do plugin de chat é que o Chat faz uso intensivo desta API ‘PresenceChannel’, e, portanto, o problema é muito mais provável de acontecer. Não acho que nenhuma alteração será necessária no chat.

4 curtidas

Isso deve corrigir o mesmo problema com os logins do Google? Meus usuários em uma de minhas instâncias onde estávamos testando o plugin de chat adoraram, mas ele quebrou os logins do Google com o mesmo erro dos logins do Discord.

5 curtidas

Sim, esta correção se aplicará a todos os diferentes tipos de login :+1:

3 curtidas