Autenticação Web e Gestão de Permissões (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/LoginPage,src/store/authStore),gatein-server(app/api/web/auth.py,app/core/dependencies.py),gatein-app(Consumidor de dados configurados no Web App)
1. Visão Geral e Arquitetura de Identidade
O sistema de Autenticação Web gerencia o acesso de operadores de Terminais, empresas Transportadoras e Administradores de Plataforma. Ao contrário do aplicativo mobile (que utiliza login direto por CPF com tokens JWT próprios do Gatein), o aplicativo Web adota uma arquitetura híbrida de segurança:
- Identidade e Autenticação Criptográfica: Gerenciada pelo Firebase Auth SDK (Web), responsável pelo controle de credenciais (E-mail/Senha), emissão e renovação automática de ID Tokens (JWT com validade de 1 hora).
- Autorização e Regras de Tenant (RBAC): Processada no backend FastAPI via validação da tabela
company_users, associando a identidade Firebase a umcompany_idespecífico e atribuindo papéis funcionais (role).
1.1 Diagrama de Sequência de Autenticação e Integração com Mobile
sequenceDiagram
autonumber
actor U as Usuário Web (Operador / Admin)
participant W as Web App (React / Vite)
participant FB as Firebase Auth
participant S as Gatein Server (FastAPI)
participant DB as PostgreSQL
actor M as App Mobile (Motorista)
U->>W: Insere E-mail e Senha no formulário
W->>FB: signInWithEmailAndPassword(email, password)
FB-->>W: Retorna Firebase ID Token (JWT com TTL 1h)
W->>S: GET /web/auth/me (Header: Authorization Bearer <token>)
S->>FB: verify_id_token(token) via Firebase Admin SDK
S->>DB: Query CompanyUser (join Company) por email/uid
S->>S: Valida is_active == True e permissões por Role
S-->>W: Retorna perfil completo (CompanyUserResponse)
W->>W: Armazena estado global na authStore e abre Dashboard
note over W, M: Configurações de Pátio, Layouts e Geofence salvas no Web App<br/>ficam disponíveis instantaneamente para o App Mobile dos motoristas.
2. Estrutura de Usuários e Matriz de Permissões (RBAC)
2.1 Modelo Relacional no Banco de Dados (company_users)
| Coluna | Tipo SQL | Constraints | Descrição / Regra |
|---|---|---|---|
id | UUID | PRIMARY KEY, Default gen_random_uuid() | Identificador único interno |
company_id | UUID | FOREIGN KEY (companies.id), NOT NULL | Empresa à qual o usuário pertence (Tenant) |
email | VARCHAR(255) | UNIQUE, NOT NULL | E-mail de login (chave de vínculo com Firebase Auth) |
name | VARCHAR(255) | NOT NULL | Nome completo do usuário/operador |
role | VARCHAR(32) | NOT NULL, Default 'terminal' | Papel funcional no sistema (admin, terminal, transportador, platform_admin) |
is_active | BOOLEAN | NOT NULL, Default True | Status de ativação da conta física |
created_at | TIMESTAMPTZ | NOT NULL, Default now() | Data de provisionamento do usuário |
2.2 Matriz de Acesso por Role
| Role | Escopo de Acesso | Ações Permitidas | Impacto no App Mobile |
|---|---|---|---|
admin | Total na Empresa | Acesso irrestrito a API Keys, usuários, geofence, serviços, layouts, anúncios e relatórios. | Controla parâmetros globais visualizados pelo motorista. |
terminal | Operacional Pátio | Gestão de agendamentos (Appointments), aprovação/rejeição de check-ins, controle de docas e emissão de tickets. | Libera entradas físicas e despacha notificações FCM de ticket ao celular do motorista. |
transportador | Operacional Frota | Cadastro de viagens (Trips), solicitação de agendamentos e acompanhamento de status de carga. | Define viagens e cargas atribuídas ao CPF do motorista. |
platform_admin | Global / Infra | Acesso a todas as empresas clientes, gestão de chaves de sistema e ferramentas de homologação. | Gerencia dados de staging/fake GPS. |
3. Schemas de Requisição e Resposta
Resposta de Perfil Autenticado (CompanyUserResponse):
{
"success": true,
"data": {
"user": {
"id": "p4k2n8m9",
"email": "carlos.eduardo@terminal-santos.com.br",
"name": "Carlos Eduardo",
"role": "admin",
"is_active": true,
"company": {
"id": "c9x8v7b6",
"name": "Terminal Marítimo Santos",
"type": "terminal",
"use_remote_checkin": true
}
}
}
}
Alteração de Senha (POST /web/auth/change-password):
- Request:
{
"current_password": "SenhaAntiga123!",
"new_password": "NovaSenhaSegura456!"
}
- Response:
{ "success": true, "message": "Senha alterada com sucesso." }
4. Regras de Negócio Explícitas (RN-WEB-AUTH-XXX)
RN-WEB-AUTH-001: Validação Rígida de Status Ativo (is_active)
Mesmo que a autenticação no Firebase Auth retorne sucesso, a dependência get_current_company_user do FastAPI consulta o banco de dados e rejeita requisições com HTTP 403 (USER_DEACTIVATED) caso o campo is_active esteja como False.
RN-WEB-AUTH-002: Isolamento Automático de Tenant (company_id)
A extração do company_id é efetuada estritamente através da sessão do usuário autenticado no token Firebase. O cliente Web não tem permissão para alterar o company_id nos cabeçalhos ou payloads para acessar dados de terceiros.
RN-WEB-AUTH-003: Papel Admin com Acesso Irrestrito Dentro da Empresa
Usuários com role == "admin" possuem validação bypassed em checagens de permissões granulares (require_permission), tendo controle total sobre os módulos da sua empresa. A interface exibe a tag "Acesso Total".
RN-WEB-AUTH-004: Sincronização entre Web App e App Mobile
Alterações realizadas por usuários web (ex: atualizar geofence, publicar anúncios, emitir tickets) disparam invalidação de cache e/ou notificações FCM em tempo real para os aplicativos mobile dos motoristas impactados.
5. Tabela de Erros de Autenticação Web
| Código HTTP | Código Interno | Causa Raiz | Ação Recomendada no Web App |
|---|---|---|---|
401 Unauthorized | INVALID_FIREBASE_TOKEN | ID Token expirado (> 1h) ou token corrompido | Executar firebase.auth().signOut() e redirecionar para /login |
403 Forbidden | USER_DEACTIVATED | Operador desativado pelo administrador da empresa | Exibir modal notificando o bloqueio da conta |
404 Not Found | COMPANY_USER_NOT_FOUND | E-mail autenticado no Firebase não existe em company_users | Exibir mensagem de erro de provisionamento cadastral |