Autenticação
A WebApiAlcance suporta dois mecanismos de autenticação distintos, escolhidos conforme o tipo de consumidor - uma pessoa logando via UI ou um sistema automatizado consumindo a API. Os dois esquemas convivem no mesmo middleware: a API tenta primeiro decodificar como JWT; se falhar, faz fallback para API Key.
Ambos os mecanismos usam o esquema Bearer no header Authorization - a distinção é feita pelo formato do conteúdo do token, não pelo nome do header.
Caminho A - JWT (operadores humanos)
Operadores humanos (contadores, analistas, administradores) autenticam por login (ou e-mail) e senha no endpoint:
POST /api/v1/auth/tokenA requisição segue o padrão OAuth2 Password Flow - formato application/x-www-form-urlencoded, campos username e password. O campo username aceita o login ou o e-mail cadastrado, de forma insensível a maiúsculas/minúsculas e a espaços nas pontas. A senha é comparada exatamente como enviada (diferencia maiúsculas e espaços). Credenciais que não possam ser resolvidas a uma única conta ativa retornam 401.
A resposta devolve um JWT assinado com a chave secreta do servidor, contendo o sub (login), o perfil RBAC do usuário (administrador, diretoria ou funcionario, base da autorização) e a lista de scopes autorizada. O campo role também é devolvido por compatibilidade, mas é uma coluna legada que não determina permissões.
O cliente envia esse JWT em todas as chamadas subsequentes:
Authorization: Bearer <jwt>O token tem validade limitada (configurada via ACCESS_TOKEN_EXPIRE_MINUTES no servidor) - após expirar, retorna 401 e o operador precisa reautenticar.
Sem endpoint de refresh
A versão atual da WebApi não expõe /auth/refresh. O fluxo de renovação automática de JWT está previsto para versões futuras - por enquanto, clientes humanos devem reautenticar via /auth/token. Verifique com TI Alcance se há mudança recente no Swagger antes de implementar.
O endpoint /auth/token é protegido por rate limit (padrão 10 tentativas / 60 segundos por IP) - exceder retorna 429 Too Many Requests.
Caminho B - API Key (automações)
Sistemas automatizados (gateway MCP, integrações parceiras, scripts internos) autenticam com uma API Key de longa duração, emitida e administrada pelo Hub - o painel interno da Alcance.
A API Key é vinculada a um usuário emissor, recebe um conjunto explícito de escopos (recurso:acao) e pode ter data de expiração opcional. Após criada, a chave em texto plano é exibida apenas uma vez - guarde-a em cofre seguro.
O cliente envia a API Key no mesmo header que o JWT:
Authorization: Bearer <api_key>O middleware tenta decodificar como JWT primeiro; ao falhar, valida como API Key consultando o banco. Os escopos são cacheados por 30 segundos por API Key para reduzir latência.
Diferenças práticas
| Característica | JWT | API Key |
|---|---|---|
| Audiência | Operadores humanos via UI | Automações / integrações |
| Origem | Login com usuário + senha | Emissão pelo Hub |
| Validade | Curta (minutos / horas) | Personalizada através do Hub |
| Escopos | Derivados do perfil RBAC do usuário | Personalizado através do Hub |
| Revogação | Expira sozinho | Personalizado através do Hub |
| Renovação | Reautenticar em /auth/token | Rotação manual ou reativação no Hub |
Exemplo curl
# Caminho A - JWT (login humano, aceita login ou e-mail em "username")
curl -X POST https://api.contabilidadealcance.com.br/api/v1/auth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=operador@alcance.com.br&password=SENHA"
# Resposta:
# {
# "access_token": "eyJhbGciOi...",
# "token_type": "bearer",
# "role": "admin",
# "perfil": "administrador",
# "scopes": ["*:*"]
# }role é um campo legado, mantido apenas por compatibilidade - não determina permissões. Quem governa a autorização é o perfil, como no exemplo acima.
Erros comuns
- 401 Unauthorized - token ausente, malformado ou expirado. Detalhe
"Nao foi possivel validar as credenciais". Para JWT, reautentique; para API Key, verifique se a chave foi desativada. - 403 Forbidden - credencial válida, mas escopo insuficiente para o recurso. Detalhe
"Escopo necessario: <recurso>:<acao>". Solicite ampliação de escopo ao admin Alcance. - 429 Too Many Requests - rate limit em
/auth/token. Aguarde a janela (60s por padrão) antes de tentar novamente.
API Keys equivalem a senha
Uma API Key concede acesso direto à WebApi sob a identidade do usuário emissor. Trate-a como credencial sensível:
- Nunca commite em repositório, mesmo privado.
- Nunca logue em STDOUT, arquivos de log ou ferramentas de observabilidade.
- Rotacione a cada 90 dias - gere nova chave, atualize o consumidor, então desative a antiga.
- Use HTTPS sempre. Bearer trafega em texto puro dentro do header.
- Em caso de suspeita de vazamento, solicite imediatamente a desativação da chave no Hub.