Conn2Flow
Navegação das docs

SDD

Requisição 172 — Correção do Fluxo de reCAPTCHA v3/v2 e Turnstile em Telas de Autenticação Tailwind

Origem: Relato de falha no login de novo.[REDACTED].com com reCAPTCHA v3/v2 ativo, gerando bloqueio falso-positivo ("robô") sem exibição do checkbox reCAPTCHA v2. Lote Vinculado…

Origem: Relato de falha no login de novo.[REDACTED].com com reCAPTCHA v3/v2 ativo, gerando bloqueio falso-positivo ("robô") sem exibição do checkbox reCAPTCHA v2.
Lote Vinculado: BATCH-177.
Status: ready-for-intake.


1. Diagnóstico e Causa-Raiz

Ao ativar a proteção de reCAPTCHA no ambiente de produção/staging (novo.[REDACTED].com) e tentar efetuar login com credenciais válidas, o sistema bloqueia o acesso emitindo o alerta:

"A sua requisição não foi aceita pois nosso sistema automático de segurança considerou a mesma sendo feita por um robô. Favor tentar novamente, mas caso o problema persista, favor entrar em contato clicando aqui."

Causa-Raiz 1: reCAPTCHA v3 Nunca Executa em Telas Tailwind (perfil-usuario.js)

Em gestor/modulos/perfil-usuario/perfil-usuario.js:

var temFormFomantic = (typeof $ !== 'undefined' && typeof $.fn !== 'undefined' && typeof $.fn.form === 'function');
...
// A validação e o gancho do reCAPTCHA abaixo são do Fomantic. Em Tailwind, `interface-tailwind.js`
// valida pelas mesmas `gestor.interface.regrasValidacao` e intercepta o `submit` nativo.
if(temFormFomantic)
$(formSelector2).form({ ... grecaptcha.execute(...) ... });

Nas telas migradas para Tailwind CSS (layout-administrativo-tailwind ou layouts públicos Tailwind), o Fomantic UI não é carregado (temFormFomantic é false). O comentário supôs que interface-tailwind.js executaria o reCAPTCHA, porém interface-tailwind.js não possui nenhuma linha de código para reCAPTCHA ou captcha. Como resultado:

  • O formulário Tailwind é submetido nativamente sem os campos token e action.

  • O backend (perfil-usuario.php) recebe $_POST['token'] vazio.

  • A validação gestor_captcha_validar() falha imediatamente.

  • O backend assume que a requisição veio de um robô e dispara alert-recaptcha-invalid.

Causa-Raiz 2: Inexistência de Fallback para reCAPTCHA v2 no Módulo perfil-usuario

Enquanto o módulo de formulários dinâmicos (formulario.php) possui o degrau intermediário de exigir o reCAPTCHA v2 (status => 'require_v2') quando o v3 falha ou retorna score < 0.5, o módulo de login/autenticação (perfil-usuario.php):

  • Nunca implementou o fallback para o checkbox v2.

  • Rejeita o usuário sumariamente via interface_alerta(['redirect' => true, 'msg' => $alerta]) mesmo que USUARIO_RECAPTCHA_V2_ACTIVE esteja ligado com chaves válidas no .env.

  • O usuário fica preso sem qualquer meio interativo de provar que é humano.


2. Escopo

2.1 Interceptação de Captcha Agnóstica ao Framework no Frontend

  1. Em gestor/modulos/perfil-usuario/perfil-usuario.js:

    • Desacoplar a execução de captcha do plugin $.fn.form do Fomantic.

    • Adicionar ouvinte de submissão para formulários Tailwind (#_gestor-form-logar, #_gestor-form-autenticar, #_gestor-form-signup, #_gestor-form-forgot-password).

    • Quando googleRecaptchaActive ou turnstileSiteKey estiver presente em gestor:

      • Interceptar o primeiro clique de envio.

      • Executar o reCAPTCHA v3 (grecaptcha.execute()) ou obter o token do Turnstile.

      • Injetar os campos ocultos token e action (ou cf-turnstile-response).

      • Prosseguir com a submissão nativa do formulário (sem disparar laço infinito de submit).

2.2 Implementação do Fallback para reCAPTCHA v2 em Telas de Autenticação

  1. No Backend (perfil-usuario.php):

    • Se CAPTCHA_PROVIDER === 'google-recaptcha' e o v3 falhar (ou score < 0.5), verificar se $_CONFIG['usuario-recaptcha-v2-active'] está ativo.

    • Se o v2 estiver ativo e ainda não tiver sido submetido g-recaptcha-response:

      • Não disparar o alerta imediato de robô.

      • Retornar o formulário em estado de exigência de v2 (ex.: sinalizar para a view renderizar o contêiner do reCAPTCHA v2).

    • Se g-recaptcha-response tiver sido enviado, validar contra usuario-recaptcha-v2-server via gestor_captcha_validar(null, ['v2' => true]).

    • Se a validação do v2 passar, permitir que o fluxo de autenticação/login prossiga normalmente.

  2. No Frontend:

    • Renderizar o widget do reCAPTCHA v2 (checkbox) na tela quando solicitado pelo backend.

2.3 Paridade com o Cloudflare Turnstile

  • Assegurar que os formulários de login sob Tailwind suportem o Turnstile sem necessidade do plugin do Fomantic.


3. Critérios de Aceitação

  1. Login Funcional em Tailwind com reCAPTCHA v3: Em páginas de login sob framework Tailwind com reCAPTCHA v3 ativo, o formulário envia o token e autentica o usuário com credenciais corretas sem acusar robô.

  2. Fallback para reCAPTCHA v2: Em caso de suspeita ou score baixo no v3, o formulário exibe o checkbox do reCAPTCHA v2 em vez de barrar o usuário diretamente.

  3. Validação do reCAPTCHA v2: Ao marcar o checkbox v2 e reenviar, o backend valida o token v2 e conclui o login com sucesso.

  4. Sem Dependência de Fomantic: O ciclo completo de captura de token funciona em Tailwind puro sem chamar $.fn.form.

  5. Suíte sem Regressões: Todos os testes unitários do PHPUnit e Vitest passam com exit 0.

O Futuro é Híbrido: Humano + IA.

O Conn2Flow é a ferramenta. Se você precisa do Arquiteto para desenhar a estratégia da sua empresa usando essa tecnologia...

Contrate Consultoria Especializada