-
Notifications
You must be signed in to change notification settings - Fork 371
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
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
There was a problem hiding this 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.
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%. |
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. |
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:
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.
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 douseUser
de não enviar requisição para/api/v1/user
se não for necessário.Tipo de mudança
Checklist: