Logotipo Hedhog

Receba novidades do Hedhog no seu e-mail

Novos lançamentos, receitas e breaking changes — sem spam.

CAPTCHA

O Hedhog pode verificar um token de CAPTCHA no servidor usando Google reCAPTCHA, Cloudflare Turnstile ou ALTCHA. Hoje, isso está conectado a exatamente um lugar — o formulário público de inscrição na lista de destinatários de campanha — e não ao login, registro ou formulários de contato arbitrários. Se você precisar de CAPTCHA em outro lugar, pode reutilizar a mesma lógica de verificação, mas terá que fazer a integração você mesmo, em vez de acionar um interruptor global.

Status: ⚠️ Escopo limitado — os três provedores estão genuinamente implementados, mas apenas o formulário público de inscrição de campanha realmente os chama hoje.

Formulário público de inscrição enviando um captcha_token através de validateCaptcha() para reCAPTCHA, Turnstile ou ALTCHA

Configuração Rápida

  1. Crie um Perfil de Integração (tipo CAPTCHA, escolha um provedor) com sua chave secreta em Settings → Integration Profiles
  2. Abra a lista de destinatários de campanha que você quer proteger, habilite CAPTCHA e selecione o perfil
  3. Incorpore o widget do provedor no seu formulário público de inscrição você mesmo e envie o token resolvido como captcha_token

Como Funciona (hoje)

O CAPTCHA é uma configuração por lista em campaign_recipient_list, não um interruptor global:

ColunaDescrição
enable_captchaBooleano — se esta lista pública de inscrição específica exige um token de CAPTCHA
captcha_integration_profile_idContra qual Perfil de Integração (tipo captcha) verificar

Quando alguém envia o formulário público de inscrição (publicSignup() em CampaignRecipientListService) para uma lista com enable_captcha = true:

  1. A requisição precisa incluir um campo captcha_token
  2. O Hedhog carrega o Perfil de Integração configurado e olha para o slug do seu provedor
  3. Ele chama a lógica de verificação do provedor correspondente de forma síncrona, no servidor, antes que o destinatário seja gravado no banco de dados
  4. Um token ausente ou inválido retorna 400 Bad Request — a inscrição nunca acontece

Todos os três provedores abaixo estão genuinamente implementados e verificados no servidor — não é uma situação de "alguns provedores são stubs".

O Que o Hedhog Não Faz Por Você

Não existe endpoint que retorne uma site_key de CAPTCHA para o navegador, e nenhum endpoint que emita um desafio ALTCHA. Se você está construindo a página pública de inscrição você mesmo:

  • Para reCAPTCHA/Turnstile, você já conhece sua própria site_key (é a contraparte pública da secret_key que você digitou no Perfil de Integração) — incorpore o script do widget do provedor diretamente com essa chave, você não precisa que o Hedhog a devolva para você
  • Para ALTCHA, que precisa de um servidor para emitir um desafio assinado antes que o cliente possa resolvê-lo, o Hedhog apenas verifica o desafio resolvido — você precisará adicionar seu próprio pequeno endpoint que gera o desafio (salt + HMAC) usando a mesma hmac_key, ou usar o pacote auxiliar de servidor do próprio ALTCHA para isso, antes que validateCaptcha tenha algo válido para checar

Google reCAPTCHA

Console: google.com/recaptcha/admin

  1. Registre um novo site, escolhendo reCAPTCHA v2 (desafio de caixa de seleção) ou v3 (invisível, baseado em pontuação)
  2. Adicione seu domínio à lista de domínios permitidos
  3. Copie a Site key (vai no código do widget do frontend) e a Secret key (vai no Perfil de Integração)
Campo de configuraçãoDescrição
secret_keySegredo do servidor usado contra https://www.google.com/recaptcha/api/siteverify

A verificação do Hedhog checa apenas success na resposta do Google — atualmente ela não impõe um limite de pontuação do v3, então, se você usar o v3, decida sua própria pontuação aceitável e adicione essa checagem se precisar.


Cloudflare Turnstile

Console: dash.cloudflare.com → Turnstile

  1. Adicione um novo site em Turnstile, escolha um modo de widget (Managed, Non-interactive ou Invisible)
  2. Copie a Site key (frontend) e a Secret key (Perfil de Integração)
Campo de configuraçãoDescrição
secret_keySegredo do servidor usado contra https://challenges.cloudflare.com/turnstile/v0/siteverify

ALTCHA

O ALTCHA é um CAPTCHA de prova de trabalho, auto-hospedado, sem chamadas a uma API de verificação de terceiros — a verificação é pura criptografia contra uma chave que só você possui.

Projeto: altcha.org

Campo de configuraçãoDescrição
hmac_keySegredo usado tanto para assinar desafios (responsabilidade sua, veja acima) quanto para verificar tokens resolvidos (tratado pelo Hedhog)

A verificação do Hedhog decodifica o token base64 em { algorithm, challenge, number, salt, signature }, recalcula sha256(salt + number) e checa se é igual a challenge, depois recalcula um HMAC-SHA256 sobre challenge com sua hmac_key e checa se é igual a signature. Ambas as checagens precisam passar.


Habilitando o CAPTCHA em uma Lista

  1. Crie um Perfil de Integração do tipo CAPTCHA com o provedor e a secret_key/hmac_key acima
  2. Nas configurações da lista de destinatários da campanha, habilite CAPTCHA e selecione esse perfil
  3. Certifique-se de que seu formulário público de inscrição envia o token resolvido como captcha_token no corpo da requisição

Qual Provedor Escolher

  • reCAPTCHA — a adoção mais ampla, mas envia dados do visitante para o Google e o desafio do v2 adiciona atrito
  • Turnstile — mais amigável à privacidade, geralmente invisível, apoiado pela rede da Cloudflare
  • ALTCHA — zero chamadas de rede a terceiros e nenhum dado sai da sua infraestrutura, ao custo de ter que hospedar você mesmo o endpoint de emissão de desafios

Verifique se Funcionou

  • Envie o formulário público de inscrição sem resolver o CAPTCHA — ele deve ser rejeitado com 400 Bad Request
  • Resolva o widget e envie novamente — o destinatário agora deve ser criado na lista

Solução de Problemas

SintomaCausa provável
CAPTCHA is enabled but no profile is configuredenable_captcha está ligado mas captcha_integration_profile_id está vazio
CAPTCHA validation failed para todo envio ALTCHAO desafio não foi assinado com a mesma hmac_key configurada no perfil, ou ainda não há nenhum endpoint de emissão de desafios
Unsupported CAPTCHA providerO provedor do perfil não é um de recaptcha, cloudflare-turnstile, altcha
Funciona em staging, falha em produção para reCAPTCHA/TurnstileO domínio de produção não está na lista de domínios permitidos do provedor