Gestão de API Keys de Integração (Web App)
Pilar: 02 — Funcionalidades Core / Web App
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-web(src/screens/admin/ApiKey),gatein-server(app/api/web/apiKey.py,app/core/security.py),gatein-app(Destinatário das cargas criadas via API Keys)
1. Visão Geral e Integração com Sistemas Legados
O módulo de Gestão de API Keys provê aos Administradores de Terminais e Transportadoras o gerenciamento de credenciais de acesso programático (Server-to-Server). Através dessas chaves, sistemas externos de ERP (ex: SAP, TOTVS), TMS e WMS conectam-se diretamente às APIs do Gatein para realizar a inclusão, alteração e cancelamento automatizado de agendamentos e viagens.
1.1 Diagrama de Sequência: Geração no Web App e Consumo via ERP Legado
sequenceDiagram
autonumber
actor A as Admin da Empresa (Web App)
participant W as Web App (React)
participant S as Gatein Server (FastAPI)
participant DB as PostgreSQL (companies)
actor ERP as ERP / TMS Legado (Servidor Terceiro)
actor M as Motorista (App Mobile)
A->>W: Clica em "Gerar Nova Chave de API"
W->>S: POST /web/api-key/generate
S->>S: Gera full_key, extrai prefix ("gt_live_a1b2...") e gera hash bcrypt
S->>DB: Salva prefix e api_key_hash na empresa
S-->>W: Retorna full_key (Aviso: Exibido uma única vez!)
W-->>A: Exibe modal com a chave completa em texto claro
note over ERP, S: Integração Server-to-Server via API Key
ERP->>S: POST /public/v1/appointments (Header X-API-Key: <full_key>)
S->>DB: Middleware compara hash da chave enviada com api_key_hash
S->>DB: Insere agendamento e identifica a empresa proprietária
S->>M: Dispara Push FCM: "Novo agendamento recebido do ERP!"
2. Estrutura das Chaves no Banco de Dados (companies)
Para garantir segurança total em caso de vazamento do banco de dados, a chave em texto claro nunca é armazenada. O PostgreSQL grava exclusivamente o prefixo visual e o hash criptográfico bcrypt:
Coluna SQL em companies | Tipo SQL | Descrição / Regra |
|---|---|---|
api_key_prefix | VARCHAR(16) | Prefixo visual da chave primária (ex: gt_live_a1b2c345) |
api_key_hash | VARCHAR(255) | Hash seguro bcrypt da chave primária em texto claro |
api_key_secondary_prefix | VARCHAR(16) | Prefixo visual da chave secundária (ex: gt_live_x9y8z7w6) |
api_key_secondary_hash | VARCHAR(255) | Hash seguro bcrypt da chave secundária em texto claro |
3. Schemas de Requisição e Resposta
Resposta de Geração de API Key (APIKeyGenerateResponse):
{
"success": true,
"data": {
"api_key": "gt_live_a1b2c345_9876543210fedcba9876543210fedcba",
"prefix": "gt_live_a1b2c345",
"created_at": "2026-08-04T01:00:00Z",
"message": "Chave de API gerada com sucesso. Copie e guarde em local seguro."
}
}
Resposta de Listagem de Chaves (APIKeyListResponse):
{
"success": true,
"data": {
"keys": [
{ "prefix": "gt_live_a1b2c345" },
{ "prefix": "gt_live_x9y8z7w6" }
],
"total_keys": 2,
"can_create": false
}
}
4. Regras de Negócio Explícitas (RN-KEY-XXX)
RN-KEY-001: Limite Estrito de No Máximo 2 Chaves Ativas por Empresa
Cada empresa cliente pode possuir no máximo 2 (duas) chaves de API ativas simultaneamente (Chave Primária e Chave Secundária). Se o Administrador tentar chamar POST /web/api-key/generate com 2 chaves já ativas, a API rejeita com HTTP 400 (API_KEY_LIMIT_REACHED).
RN-KEY-002: Exibição Única da Chave Completa (Write-Only Key)
O valor em texto claro da API Key (full_key) só é retornado no corpo da resposta HTTP no exato momento da chamada de geração (POST /web/api-key/generate). Não existe nenhum endpoint no sistema capaz de recuperar ou exibir a chave novamente após o fechamento do modal.
RN-KEY-003: Rotação de Chaves sem Downtime (Zero Downtime Rotation)
Para permitir a troca de credenciais em sistemas produtivos sem paralisar a operação:
- O Administrador gera a Chave Secundária enquanto a Chave Primária continua em uso.
- Atualiza o ERP para utilizar a nova Chave Secundária.
- Revoga a Chave Primária antiga (
DELETE /web/api-key/delete/{prefix}).
RN-KEY-004: Middleware de Autenticação via Header X-API-Key
Endpoints públicos/admin da plataforma aceitam autenticação enviando o cabeçalho X-API-Key: <key> ou Authorization: ApiKey <key>. O middleware get_company_from_api_key:
- Extrai o prefixo (primeiros 16 caracteres).
- Localiza a empresa correspondente no PostgreSQL.
- Valida a chave completa contra o hash
bcryptgravado (api_key_hashouapi_key_secondary_hash). - Injete o contexto da empresa na requisição.
5. Detalhamento de Endpoints
5.1 GET /web/api-key/list
Retorna os prefixos visuais das chaves ativas e o indicador can_create.
5.2 POST /web/api-key/generate
Gera um novo par de chaves e retorna o segredo em texto claro.
5.3 POST /web/api-key/regenerate
Substitui a chave do prefixo indicado por um novo segredo.
5.4 DELETE /web/api-key/delete/{prefix}
Revoga permanentemente a chave correspondente ao prefixo fornecido.
6. Regras de Segurança e Tabela de Erros
| Código HTTP | Código Interno | Causa Raiz | Ação no Web App |
|---|---|---|---|
400 Bad Request | API_KEY_LIMIT_REACHED | Limite de 2 chaves já foi atingido | Solicitar revogação ou rotação de chave |
401 Unauthorized | API_KEY_INVALID | Chave de API inexistente, malformada ou revogada | Verificar o header enviado no sistema ERP |
404 Not Found | API_KEY_PREFIX_NOT_FOUND | Prefixo informado não pertence à empresa do admin | Atualizar a lista de chaves na interface |