Autenticação vs. autorização: o que validar em testes
Autenticação responde “quem é você?”: o cliente prova sua identidade (por exemplo, com uma chave, credenciais ou token). Autorização responde “o que você pode fazer?”: o servidor decide se aquele usuário/cliente tem permissão para acessar um recurso ou executar uma ação (por perfil, papel, escopo, tenant, etc.).
Em testes de API, isso vira um conjunto de validações essenciais: (1) o mecanismo de autenticação aceita credenciais válidas e rejeita inválidas; (2) as permissões são aplicadas corretamente por endpoint e por operação; (3) falhas retornam códigos e mensagens consistentes; (4) segredos não vazam em logs.
Mapa rápido de respostas esperadas (401 vs 403)
- 401 Unauthorized: a requisição não está autenticada (credencial ausente, inválida, expirada, token malformado, assinatura inválida, etc.). Normalmente inclui desafio (ex.:
WWW-Authenticate) quando aplicável. - 403 Forbidden: o cliente está autenticado, mas não tem permissão para aquela ação/recurso (escopo insuficiente, papel inadequado, política de acesso negou).
| Cenário | Esperado |
|---|---|
| Sem credencial | 401 |
| Credencial inválida | 401 |
| Token expirado/revogado | 401 (ou 403 em algumas políticas, mas padronize e teste o contrato) |
| Credencial válida, mas sem permissão | 403 |
| Credencial válida, permissão ok | 2xx/3xx conforme o contrato do endpoint |
Mecanismos comuns de autenticação e como testá-los
1) API Key
Uma API key é um segredo (ou identificador secreto) enviado pelo cliente para autenticar o consumo. Pode ser enviada em header (recomendado) ou query string (evitar por exposição em logs e caches).
Exemplos comuns:
- Header dedicado:
X-API-Key: <chave> - Header custom:
Authorization: ApiKey <chave>(menos comum)
Passo a passo prático: casos de teste para API Key
- Chave válida: enviar a key correta e validar sucesso (status e corpo conforme contrato).
- Chave ausente: omitir o header e validar
401e payload de erro padronizado. - Chave inválida: enviar valor aleatório e validar
401. - Chave revogada: usar uma key previamente revogada (ou marcar como revogada em ambiente de teste) e validar
401. - Chave com escopo limitado (quando existir): key válida, mas sem permissão para endpoint sensível → validar
403.
# Exemplo (curl) com API Key em header dedicado (ajuste ao seu contrato) curl -i https://api.exemplo.com/v1/relatorios -H "X-API-Key: ${API_KEY}"2) Basic Auth
Basic Auth envia usuário e senha codificados em Base64 no header Authorization. Importante: Base64 não é criptografia; por isso, Basic Auth deve ser usado apenas com TLS (HTTPS) e, em geral, é mais comum em integrações internas ou para obter tokens.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Formato:
Authorization: Basic base64(usuario:senha)Passo a passo prático: casos de teste para Basic Auth
- Credenciais válidas: validar sucesso e que o endpoint retorna o esperado.
- Usuário/senha inválidos: validar
401. - Header ausente: validar
401. - Header malformado: por exemplo,
Authorization: Basicsem credenciais → validar401(ou400se o contrato definir erro de formato; padronize e teste). - Proteção de endpoint sensível: garantir que endpoints administrativos não aceitam Basic Auth se a política exigir token (ou aceitam apenas para perfis específicos). Se autenticado mas sem permissão →
403.
# Exemplo (curl) com Basic Auth curl -i https://api.exemplo.com/v1/conta -u "usuario:senha"3) Bearer Token (com noções de JWT)
Bearer token é um token enviado no header Authorization com o esquema Bearer. Quem possui o token (“bearer”) consegue acessar conforme as permissões associadas, então o token deve ser protegido.
Authorization: Bearer <token>Um formato comum é o JWT (JSON Web Token), que geralmente tem três partes separadas por ponto: header.payload.signature. Em testes, você não precisa aprofundar criptografia; foque em validar comportamentos: expiração (exp), emissor/audiência (quando aplicável), e principalmente escopos/roles presentes no token.
Passo a passo prático: fluxo típico para obter e usar token
- Obter token: chamar o endpoint de autenticação (ex.:
/auth/token) com credenciais válidas. - Extrair token: do JSON de resposta (ex.:
access_token). - Usar token: enviar em
Authorization: Bearerpara endpoints protegidos. - Validar claims relevantes (quando expostas/decodificáveis no ambiente de teste): expiração, escopos, roles, tenant.
# Exemplo (pseudo) 1) obter token POST /auth/token { "username": "ana", "password": "***" } => 200 { "access_token": "eyJ...", "expires_in": 3600 } 2) usar token GET /v1/pedidos Authorization: Bearer eyJ...Testando autorização: permissões por perfil, papel e escopo
Autorização costuma ser expressa como:
- Roles/papéis: ex.:
admin,manager,user. - Scopes/escopos: ex.:
orders:read,orders:write. - Políticas por recurso: ex.: “usuário só acessa pedidos do próprio
customerId”. - Contexto multi-tenant: ex.:
tenantIdno token deve bater com o recurso.
Matriz de permissões (modelo para planejar testes)
Monte uma tabela com endpoints sensíveis e quais perfis/escopos podem executar cada operação. Isso evita lacunas e ajuda a automatizar.
| Endpoint | Ação | Permissão necessária | Perfis que devem passar | Perfis que devem falhar |
|---|---|---|---|---|
| /v1/users | GET | users:read | admin, support | user |
| /v1/users | POST | users:write | admin | support, user |
| /v1/reports | GET | reports:read | admin, manager | user |
Casos de teste essenciais para autorização
- Escopo insuficiente: token válido com
orders:readtentandoPOST /orders→403. - Papel inadequado: usuário autenticado com role
useracessando endpoint administrativo →403. - Isolamento por recurso: usuário A tenta acessar recurso do usuário B (IDOR) →
403(ou404se a política for “não revelar existência”; defina e teste o contrato). - Multi-tenant: token do tenant X tenta acessar recurso do tenant Y →
403/404 - Operações parciais: permitir leitura mas negar escrita no mesmo recurso (GET 200, PUT 403).
Validações do header Authorization (ausência, formato e robustez)
Grande parte dos bugs de segurança e de experiência do integrador aparece em bordas de parsing do header. Teste explicitamente:
Casos de teste: ausência e malformação
- Sem header Authorization: endpoint protegido deve retornar
401. - Esquema errado:
Authorization: Token abcquando o esperado éBearer→401. - Bearer sem token:
Authorization: Bearer→401. - Espaços extras:
Authorization: Bearer <token>→ deve aceitar ou rejeitar de forma consistente (defina comportamento e teste). - Token malformado: string curta, caracteres inválidos, ou (se JWT) sem três partes →
401. - Header duplicado: duas entradas de
Authorization(quando o cliente/infra permitir) → comportamento deve ser definido (rejeitar com400ou escolher a primeira/última). Ideal: rejeitar para evitar ambiguidades.
# Exemplos (curl) de cenários negativos curl -i https://api.exemplo.com/v1/pedidos # sem Authorization curl -i https://api.exemplo.com/v1/pedidos -H "Authorization: Bearer" curl -i https://api.exemplo.com/v1/pedidos -H "Authorization: Token abc"Expiração e revogação de token: como testar
Dois comportamentos diferentes:
- Expiração: o token deixa de ser válido após um tempo (ex.: claim
expno JWT ou TTL no servidor). - Revogação: o token é invalidado antes do tempo (logout, rotação de credenciais, comprometimento, bloqueio de usuário).
Passo a passo prático: expiração
- Obtenha um token com curto tempo de vida (ambiente de teste pode ter TTL reduzido).
- Use o token e valide sucesso.
- Aguarde passar o TTL (ou avance o relógio em ambiente controlado).
- Reenvie a mesma requisição com o token expirado.
- Valide
401e um erro que indique expiração (sem expor detalhes sensíveis).
Passo a passo prático: revogação
- Obtenha um token.
- Use o token e valide sucesso.
- Revogue o token (endpoint de logout/revoke, rotação de segredo, desativação do usuário, ou ação administrativa no ambiente de teste).
- Reenvie a requisição com o token revogado.
- Valide
401(ou o comportamento definido no contrato) e que o acesso não é permitido.
Dica de teste de regressão: se a API usa refresh tokens, valide que o access token expirado pode ser renovado apenas com refresh token válido; refresh token revogado deve falhar.
Proteção de endpoints sensíveis: o que não pode passar
Endpoints sensíveis incluem: administração de usuários, permissões, relatórios financeiros, exportações, chaves/segredos, operações destrutivas (delete), e qualquer endpoint que exponha dados pessoais.
Checklist de testes para endpoints sensíveis
- Sem autenticação →
401. - Autenticado com perfil comum →
403. - Autenticado com perfil correto → sucesso.
- Validação de “owner”: usuário só acessa o que é dele (ou do seu tenant).
- Operações destrutivas: exigir escopo/papel explícito (não herdar permissões amplas indevidamente).
- Evitar escalonamento: um token com permissão de leitura não deve conseguir escrever por endpoints alternativos.
Contratos de erro e segurança: o que validar na resposta
Além do status code, valide o contrato do erro:
- Corpo consistente: campos como
code,message,details,traceId(se existir) devem seguir padrão. - Sem vazamento de informação: não retornar stack trace, detalhes de validação interna de token, ou indicar se “usuário existe” em cenários de login (evitar enumeração).
- Headers esperados: quando aplicável, validar
WWW-Authenticateem401(por exemplo, em Basic Auth) e ausência de dados sensíveis em headers.
Mascaramento de segredos em logs de teste
Automação de testes costuma registrar requests/responses para depuração. Isso é útil, mas perigoso se tokens e chaves forem logados em texto puro. A regra é: logar o suficiente para diagnosticar, mas nunca segredos.
O que deve ser mascarado
- Headers:
Authorization,X-API-Key,Cookie,Set-Cookie. - Campos de payload:
password,client_secret,refresh_token,access_token. - Parâmetros de URL (se existirem):
api_key,token.
Estratégias práticas de mascaramento
- Redação total: substituir o valor por
***(mais seguro). - Redação parcial: manter prefixo/sufixo para correlação (ex.:
abcd...wxyz), útil para identificar qual credencial foi usada sem expor o segredo. - Separar logs: logs detalhados apenas localmente; em CI, logs reduzidos.
- Evitar persistência: não salvar fixtures com tokens reais; use variáveis de ambiente e segredos do pipeline.
// Exemplo de regra de mascaramento (pseudo) function sanitize(headers, body) { redact(headers, ["authorization", "x-api-key", "cookie", "set-cookie"]) redactJsonFields(body, ["password", "client_secret", "access_token", "refresh_token"]) return { headers, body } } // Exemplo de log seguro Authorization: Bearer ***Roteiro de suíte mínima de testes (autenticação + autorização)
Uma suíte enxuta, mas efetiva, costuma incluir:
- Autenticação: credencial válida → sucesso; ausente → 401; inválida → 401; malformada → 401/400 conforme contrato.
- Token: expirado → 401; revogado → 401; refresh (se houver) → sucesso/erro conforme cenário.
- Autorização: perfil/escopo correto → sucesso; perfil/escopo insuficiente → 403; acesso a recurso de outro usuário/tenant → 403/404 conforme política.
- Endpoints sensíveis: sempre cobertos por testes negativos (sem auth e sem permissão).
- Logs: validação indireta via revisão/checagem automatizada de que segredos não aparecem (por exemplo, varrer logs por padrões como
Bearerseguido de token).