Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adiciona Turnstile para executar os desafios da Cloudflare sempre que for necessário #1613

Merged
merged 1 commit into from
Jan 26, 2024

Conversation

aprendendofelipe
Copy link
Collaborator

@aprendendofelipe aprendendofelipe commented Jan 26, 2024

Resolve o problema que ocorre quando estamos com medidas de segurança ativadas na Cloudflare e que acabam bloqueando requisições legítimas, principalmente as que ocorrem em segundo plano (requisições para API ou prefetch de dados para navegação SPA).

Quando medidas de segurança estão ativadas, a Cloudflare desafia os navegadores para detectar ferramentas automatizadas. Em alguns casos o desafio pode exigir alguma interação do usuário, mas geralmente ocorre de forma automática.

No modo normal, esses desafios são enviados como uma página HTML, então requisições em segundo plano não são capazes de executar o desafio, e acabam sendo bloqueadas.

Mudanças realizadas

Esse PR adiciona a ferramenta Turnstile da Cloudflare, que nos permite disparar a execução dos desafios via JS, seja em segundo plano, ou em um iframe.

Então agora verificamos todas as requisições com falha para saber se o bloqueio ocorreu por falta do desafio da Cloudflare (caso em que é retornado o cabeçalho cf-mitigated: challenge). Sempre que o bloqueio for pela falta do desafio, ele será executado automaticamente (pode ser em segundo plano ou interativo, quem decide é a Cloudflare).

Após a resolução do desafio, todas as requisições que tinham sido bloqueadas serão disparadas mais uma vez, já que foi criada uma fila específica para isso. Se o desafio não for interativo, isso irá ocorrer de forma totalmente transparente, parecendo apenas que a conexão ficou um pouco mais lenta até que o desafio seja concluído.

Já se o desafio for interativo, será aberto um modal com o iframe da Cloudflare solicitando a confirmação:

image

Como esse modal bloqueia a utilização do site, implementei uma saída alternativa para quem não quiser resolver o desafio. Basta tocar em qualquer lugar fora do iframe e será dada a opção de ignorar a verificação.

image

Implementei essa possibilidade de ignorar, principalmente, para o caso de ocorrer algum problema momentâneo com a verificação Cloudflare que atrapalhe a navegação normal.

Caso a verificação seja ignorada, ela não tentará novamente durante a mesma sessão, o que implicará em um uso limitado do site. Após atualizar a página (ou qualquer navegação que não seja SPA), a verificação será tentada novamente.

As requisições bloqueadas definitivamente pela Cloudflare, seja pelo usuário ter ignorado o desafio ou por algo suspeito que seja enviado nos dados da requisição, vão devolver uma mensagem que deixa claro que houve o bloqueio, não sendo mais exibida a mensagem que pedia para verificar se o serviço estava disponível. Como a requisição não chega até o TabNews, essa substituição da mensagem ocorre no client.

Com essa modificação foi possível remover o método alternativo que existia no useUser e que fazia um refresh automático na página de login se ocorresse um bloqueio na requisição que busca dados do usuário. Essa nova versão é melhor porque se aplica para qualquer requisição, não exige mais que a página seja recarregada para executar o desafio e volta a estratégia do useUser de não enviar requisição para /api/v1/user se não for necessário.

Tipo de mudança

  • Correção de bug
  • Nova funcionalidade

Checklist:

  • As modificações não geram novos logs de erro ou aviso (warning).

Copy link

vercel bot commented Jan 26, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated (UTC)
tabnews ✅ Ready (Inspect) Visit Preview Jan 26, 2024 2:14pm

pages/interface/hooks/useUser/index.js Dismissed Show dismissed Hide dismissed
@aprendendofelipe aprendendofelipe linked an issue Jan 26, 2024 that may be closed by this pull request
@aprendendofelipe aprendendofelipe added front Envolve modificações no frontend novo recurso Nova funcionalidade/recurso bug Comportamento diferente do esperado labels Jan 26, 2024
Copy link
Collaborator

@Rafatcb Rafatcb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Que bom que deu para resolver os issues sobre diferenciar o retorno da Cloudflare 🎉

A implementação parece OK, mas fiquei com duas dúvidas que deixei na revisão.

@aprendendofelipe aprendendofelipe merged commit 125deed into main Jan 26, 2024
7 checks passed
@aprendendofelipe aprendendofelipe deleted the turnstile branch January 26, 2024 23:38
@aprendendofelipe
Copy link
Collaborator Author

Em produção 🚀🚀🚀

Tudo funcionando conforme o esperado, com 100% dos desafios resolvidos, e tudo sem interação, ou seja, em segundo plano.

Talvez todos tenham sido por mim mesmo, que fiz alguns testes nos últimos 30 minutos 😅

Apenas para comparação futura, nas últimas 24 horas a taxa de sucesso do desafio na página e API de cadastro estava em apenas 9,84%.

@aprendendofelipe
Copy link
Collaborator Author

Resultado após 6 dias de Turnstile:

A taxa de solução dos desafios do Turnstile está em 75%, e apenas 10% dos desafios são interativos.

Já a taxa de sucesso do desafio específico da página e API de cadastro acabou diminuindo para 4,2% (estava em 9,84% antes do PR), mas a causa disso é que houve grande redução nos casos de apresentação do desafio. Agora está em 1/3 do que antes. Ou seja, o desafio passou a aparecer muito menos para usuários legítimos, e por isso a taxa de solução é menor.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Comportamento diferente do esperado front Envolve modificações no frontend novo recurso Nova funcionalidade/recurso
Projects
None yet
2 participants