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.

Configuração Rápida
- Crie um Perfil de Integração (tipo CAPTCHA, escolha um provedor) com sua chave secreta em Settings → Integration Profiles
- Abra a lista de destinatários de campanha que você quer proteger, habilite CAPTCHA e selecione o perfil
- 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:
| Coluna | Descrição |
|---|---|
enable_captcha | Booleano — se esta lista pública de inscrição específica exige um token de CAPTCHA |
captcha_integration_profile_id | Contra 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:
- A requisição precisa incluir um campo
captcha_token - O Hedhog carrega o Perfil de Integração configurado e olha para o slug do seu provedor
- 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
- 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 dasecret_keyque 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 quevalidateCaptchatenha algo válido para checar
Google reCAPTCHA
Console: google.com/recaptcha/admin
- Registre um novo site, escolhendo reCAPTCHA v2 (desafio de caixa de seleção) ou v3 (invisível, baseado em pontuação)
- Adicione seu domínio à lista de domínios permitidos
- 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ção | Descrição |
|---|---|
secret_key | Segredo 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
- Adicione um novo site em Turnstile, escolha um modo de widget (Managed, Non-interactive ou Invisible)
- Copie a Site key (frontend) e a Secret key (Perfil de Integração)
| Campo de configuração | Descrição |
|---|---|
secret_key | Segredo 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ção | Descrição |
|---|---|
hmac_key | Segredo 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
- Crie um Perfil de Integração do tipo CAPTCHA com o provedor e a
secret_key/hmac_keyacima - Nas configurações da lista de destinatários da campanha, habilite CAPTCHA e selecione esse perfil
- Certifique-se de que seu formulário público de inscrição envia o token resolvido como
captcha_tokenno 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
| Sintoma | Causa provável |
|---|---|
CAPTCHA is enabled but no profile is configured | enable_captcha está ligado mas captcha_integration_profile_id está vazio |
CAPTCHA validation failed para todo envio ALTCHA | O 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 provider | O provedor do perfil não é um de recaptcha, cloudflare-turnstile, altcha |
| Funciona em staging, falha em produção para reCAPTCHA/Turnstile | O domínio de produção não está na lista de domínios permitidos do provedor |