Todas as requests de webhook incluem o header X-IFood-Signature para garantir autenticidade. Valide sempre antes de processar eventos.
Obrigatório para homologação: Rejeite requests com assinatura inválida. O iFood testa sua integração enviando eventos com assinaturas incorretas.
Por que validar
URLs de webhook ficam expostas na internet. Sem validação, qualquer pessoa pode enviar eventos falsos para seu endpoint.Proteção contra:
Fraudes e ataques
Eventos forjados por terceiros
Manipulação de dados de pedidos
O iFood audita todas as tentativas de entrega. Validação correta evita processar dados maliciosos.
Como funciona
O iFood usa HMAC-SHA256 para assinar cada request:
Gera assinatura: HMAC do body usando seu client_secret
Codifica em hex: Valor final em formato hexadecimal
Envia no header:X-IFood-Signature: <assinatura>
Você deve:
Ler byte array bruto do body (sem transformações)
Gerar HMAC usando seu client_secret
Comparar com assinatura recebida (comparação segura)
Passo a passo
1. Obtenha o client secret
Acesse Developer Portal → Meus Apps → [seu app] → Credenciais e copie o client_secret (mesmo usado para gerar tokens).
Segurança: Armazene o secret de forma segura (variável de ambiente, secret manager). Nunca commite no código.
2. Valide ANTES de fazer parse
❌ Erro comum:
# NÃO FAÇA ISSOevent = request.json # Parse antes de validarvalidate_signature(event) # Assinatura pode estar errada!
✅ Correto:
# FAÇA ISSOraw_body = request.data # Byte array brutovalidate_signature(raw_body, request.headers['X-IFood-Signature'])event = json.loads(raw_body) # Parse só depois de validar
Por quê?
JSON {"a":1,"b":2} e {"b":2,"a":1} são equivalentes, mas geram byte arrays diferentes. Frameworks podem reordenar propriedades ou adicionar/remover espaços antes de você acessar o conteúdo.
A mesma mensagem pode chegar com formatações diferentes. Sua validação deve suportar todas.Exemplo: Evento PLACED com diferentes formatações (mesmo conteúdo, assinaturas diferentes):Sem espaços
# ❌ Erradoevent = request.jsonvalidate_signature(json.dumps(event), signature) # JSON pode estar reordenado!# ✅ Corretovalidate_signature(request.data, signature) # Byte array bruto
Causa 2: Client secret erradoVerifique se está usando o secret correto no Developer Portal (aba Credenciais).Causa 3: Encoding incorreto Use sempre UTF-8: