Aula prática (ap46) sobre como proteger webhooks contra abusos, com…
INEMA
🚀 Como o JWT funciona no cliente (passo a passo)⌗
1️⃣ Cliente recebe o token JWT⌗
Quando o usuário faz login (ou outro processo de autenticação inicial), o servidor gera o token JWT e envia de volta para o cliente.
📦 Exemplo de resposta do servidor:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsInJvbGUiOiJhZG1pbiJ9.LZ0yGczYz1HkX9GVJvH6TxFX_VU6yF4bJ1v7hyLZ2Vg"
}
🔑 Esse token contém:
- Header: tipo de token e algoritmo
- Payload: dados do usuário (ex.: user_id, role, email)
- Signature: assinatura com a chave secreta do servidor
2️⃣ Cliente armazena o token⌗
O cliente guarda o token para usar nas próximas requisições.
📌 Onde armazenar:
- Web app (browser):
localStorageousessionStorage - App mobile: armazenamento seguro (ex.: SecureStorage no iOS/Android)
- Aplicações desktop: arquivo de configuração criptografado
💻 Exemplo no browser:
localStorage.setItem('jwt_token', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
3️⃣ Cliente envia o token nas próximas requisições⌗
Sempre que o cliente faz uma nova chamada à API protegida, ele anexa o JWT no cabeçalho Authorization.
📡 Exemplo com fetch no JavaScript:
```const token = localStorage.getItem('jwt_token');
fetch('api.exemplo.com/user/profile ↗', { method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(data => console.log(data));```
📡 Exemplo com curl:
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
https://api.exemplo.com/user/profile
4️⃣ Servidor valida o JWT⌗
O servidor:
- ✅ Decodifica o token
- ✅ Verifica a assinatura (para garantir que não foi alterado)
- ✅ Lê os dados do payload (ex.: role, user_id)
- ✅ Permite ou nega o acesso com base nas informações do token
5️⃣ Controle de acesso com payload⌗
Como o payload contém dados como o papel do usuário (role), o cliente pode até adaptar a interface:
👨💼 Exemplo (se o papel for admin):
const payload = JSON.parse(atob(token.split('.')[1]));
if (payload.role === 'admin') {
showAdminPanel();
} else {
showUserPanel();
}
🔥 Cenário real⌗
- Você faz login com email e senha.
- O servidor responde com JWT.
- O cliente guarda o token.
- Cada chamada futura para a API inclui o token no cabeçalho.
- O servidor autentica e retorna os dados.
🎯 Resumão⌗
✅ Cliente recebe o token → guarda localmente → anexa no cabeçalho Authorization → servidor valida a cada requisição. ✅ Tudo acontece sem necessidade de enviar usuário e senha novamente. ✅ Seguro porque o servidor pode invalidar o token (com expiração ou blacklist).
1. Header Auth (Autenticação por Cabeçalho)⌗
O que é: Você cria uma chave personalizada (key-value) que deve ser enviada no cabeçalho da requisição HTTP. Apenas quem souber essa chave consegue acessar o webhook.
Como funciona:
- O servidor espera um cabeçalho com o nome e o valor exato configurados.
- Se alguém tenta acessar sem o cabeçalho ou com chave errada, a requisição é rejeitada.
Exemplo:
- Chave configurada:
Nome do cabeçalho: key
Valor: 12345
* Requisição com Postman:
``` POST /webhook-endpoint Headers: key: 12345 Body: { "message": "Olá" }
```* Resultado: ✅ Acesso permitido e o webhook processa a mensagem.
Se** enviar sem o cabeçalho correto:
**PO```ST /webhook-endpoint Headers: (nenhum cabeçalho de autenticação) Body: { "message": "Olá" }
```❌ Acesso negado: "Authorization data is wrong".
2. Basic Auth (Autenticação Básica)⌗
O que é: Você define um usuário e senha. O cliente precisa enviar esses dados no cabeçalho Authorization codificados em Base64.
Como funciona:
- O cliente envia o cabeçalho Aut`horization: Basic base64(username:password)
- `O servidor decodifica e verifica se o par usuário/senha está correto.
Exemplo:
- Usuário: tes`t
Senha: 12345-
`Cabeçalho enviado:
A```uthorization: Basic dGVzdDoxMjM0NQ==
`` *(onde dGVzdDoxMjM0NQ== é test:12345 em `Base64)*
Requ**isição com Postman:
-
**Configuração:
Au```th Type: Basic Auth Username: test Password: 12345
-
R```esultado: ✅ Acesso permitido.
Se enviar sem autenticação ou com dados errados: ❌ Acesso negado.
3. JWT (**JSON Web Token)⌗
O que é: Um t**oken assinado digitalmente que contém informações sobre o usuário e suas permissões. O servidor valida o token com uma chave secreta antes de permitir o acesso.
Como **funciona:
- O** cliente recebe um token JWT previamente gerado.
- Esse token é enviado no cabeçalho Autho`rization: Bearer
. - O` servidor valida a assinatura e extrai dados do payload (ex.: nome, e-mail, papel).
Exemp**lo de payload JWT:
{ ** "```name": "Nei", "email": "nei@exemplo.com", "role": "admin" }
- C
``have secreta para assinatura: supersecret123 -
To`ken gerado (exemplo simplificado):
eyJ```hbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTmVpIiwiZW1haWwiOiJuZWlAZXhlbXBsby5jb20iLCJyb2xlIjoiYWRtaW4ifQ.abc123xyz
Req```uis**ição com Postman:
POST** /```webhook-endpoint Headers: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... Body: { "message": "Olá" }
- Re```sultado: ✅ Acesso permitido com dados do usuário extraídos do token.
Vantage**ns do JWT:
- Permite saber quem está a**cessando.
- Dá para criar rotas diferentes por papel (admin, user).
- Limitar número de requisições por usuário.
- Revogar tokens comprometidos.
Resumo Visual⌗
| Método | Como Envia | Quando Usar |
|---|---|---|
| Header Auth | key: 12345 |
Simples, para APIs internas ou pequenos projetos |
| Basic Auth | Authorization: Basic ... | Sistemas legados ou que já suportam Basic Auth |
|
| JWT | Authorization: Bearer ... | APIs públicas, multiusuário, controle de permissões |
Resumo:
Explico de forma prática como proteger webhooks para evitar abusos e garantir a segurança de dados e custos com IA. O autor destaca que, sem autenticação, qualquer pessoa pode enviar milhões de requisições a um webhook público, gerando custos inesperados e riscos. Ele apresenta três métodos principais de autenticação:
-
Header Auth – Configura uma chave personalizada no cabeçalho da requisição (ex.: key: 12345). Só quem tem a chave consegue acessar.
-
Basic Auth – Usa nome de usuário e senha, comum em sistemas legados.
-
JWT (JSON Web Token) – Permite criar tokens únicos para cada usuário com informações como nome, e-mail e função. Dá flexibilidade para definir permissões (ex.: admin acessa mais recursos).
Com JWT, também é possível:
- Identificar quem acessou (e-mail, papel, etc.)
- Limitar o número de requisições por usuário
- Definir rotas diferentes para admins e usuários comuns
Ele demonstra cada método no Postman, mostrando como bloquear acessos sem autenticação e configurar as proteções. Finaliza reforçando a importância de implementar autenticação antes de expor webhooks em produção, especialmente quando há agentes de IA ou automações conectados.
ap46 - Proteja se Webhook
1