Sessões Ativas, Revogação e Central de Alertas
Status: Planejado — referência para implementação futura
Criado em: 2026-03-02
Pré-requisitos: JWT comjti+token_blacklist(já implementado em P2)
1. Resumo
Nova seção no painel administrativo com 2 abas:
- Sessões Ativas — lista usuários com JWT válido, permite revogar sessões individualmente ou em massa
- Alertas de Suporte — feed centralizado de alertas push (ntfy) com novos triggers em pontos críticos
2. Arquitetura
text
Frontend (admin) Edge Function Banco
+-------------------+ invokeAction +----------------+
| admin-sessoes | ------------------> | admin-sessions | --> sessoes_ativas
| (nova seção) | <------------------ | | --> token_blacklist
+-------------------+ EdgeResponse +----------------+ --> logs_transacoes
|
enviarAlertaPush()
|
ntfy.sh3. Tabela: sessoes_ativas
sql
CREATE TABLE sessoes_ativas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
jti TEXT NOT NULL UNIQUE,
usuario_id UUID NOT NULL REFERENCES usuarios(id),
nome_usuario TEXT NOT NULL,
papel_principal TEXT NOT NULL,
escola_id UUID REFERENCES escolas(id),
ip TEXT,
cidade TEXT,
estado TEXT,
pais TEXT,
user_agent TEXT,
criado_em TIMESTAMPTZ NOT NULL DEFAULT now(),
expira_em TIMESTAMPTZ NOT NULL,
revogada_em TIMESTAMPTZ,
revogada_por UUID REFERENCES usuarios(id),
motivo_revogacao TEXT
);
CREATE INDEX idx_sessoes_ativas_usuario ON sessoes_ativas(usuario_id);
CREATE INDEX idx_sessoes_ativas_jti ON sessoes_ativas(jti);
CREATE INDEX idx_sessoes_ativas_ativas ON sessoes_ativas(expira_em) WHERE revogada_em IS NULL;
-- RLS: apenas administradores
ALTER TABLE sessoes_ativas ENABLE ROW LEVEL SECURITY;
CREATE POLICY sessoes_admin_select ON sessoes_ativas
FOR SELECT TO authenticated
USING ((auth.jwt()->>'principal_role') = 'administrador');4. Edge Function: admin-sessions/index.ts
Ações
| Action | Descrição |
|---|---|
list_active | Lista sessões ativas: WHERE revogada_em IS NULL AND expira_em > NOW(), retorna usuário, papel, IP, cidade, horário |
revoke | Revoga sessão: marca revogada_em, insere jti na token_blacklist com motivo 'admin_revoke', loga em logs_transacoes, envia alerta push |
revoke_all_user | Revoga todas as sessões de um usuário (busca JTIs ativos) |
revoke_all | Revoga TODAS as sessões do sistema (emergência) — requer confirmação dupla no frontend |
Restrição: requireRole(req, 'administrador', 'admin-sessions')
5. Modificações em Edge Functions Existentes
| Arquivo | Mudança |
|---|---|
verify-otp/index.ts | Após gerar JWT, inserir em sessoes_ativas (jti, usuário, IP, geo, expira_em) |
select-role/index.ts | Idem — novo JWT = nova sessão |
logout/index.ts | Marcar revogada_em = now() na sessão correspondente ao jti |
send-otp/index.ts | Adicionar enviarAlertaPush quando mensagem WhatsApp falha |
portal-escola/index.ts | Adicionar enviarAlertaPush quando WhatsApp portal falha |
6. Expansão de Alertas ntfy.sh
Novos triggers além dos existentes:
| Trigger | Prioridade ntfy | Tags |
|---|---|---|
| WhatsApp falho em OTP (sistema) | high | warning, phone |
| WhatsApp falho em OTP (portal) | high | warning, phone |
| Revogação manual de sessão | default | lock, admin |
| Revogação em massa (emergência) | urgent | rotating_light, skull |
| 5+ acessos negados em 10min (mesmo IP) | high | police_car, warning |
O trigger de "5+ acessos negados" seria checado dentro do logAccessDenied em auth-helpers.ts — após inserir o log, faz um COUNT rápido dos últimos 10 minutos para aquele IP.
7. Componente Frontend: admin-sessoes.tsx
Nova seção no menu admin (sidebar-admin.tsx), com ícone Shield ou Monitor.
Aba "Sessões Ativas"
- Tabela com: Usuário, Papel, Escola, IP, Cidade, Login em, Expira em
- Filtros: por papel, por escola, busca por nome
- Ações: botão "Revogar" por linha, botão "Revogar Todas" (com Dialog de confirmação)
- Badge com contagem de sessões ativas no header
Aba "Alertas"
- Feed cronológico de alertas de segurança/suporte extraídos de
logs_transacoescom ações:sessao.revoke,permissao.acesso_negado,login.falha_whatsapp,sessao.revoke_mass
- Filtro por tipo e período
- Badge de "não lidos" (baseado em timestamp do último acesso do admin)
8. Hook: useAdminSessoes.ts
typescript
// Estrutura esperada
export function useAdminSessoes() {
// list_active → sessões ativas
// revoke(jti) → revogar sessão individual
// revokeAllUser(usuario_id) → revogar todas do usuário
// revokeAll() → emergência
// listAlerts(filtros) → alertas de suporte
}9. Documentação Associada
| Arquivo | Ação |
|---|---|
docs/security/SESSION_MANAGEMENT.md | CRIAR — documenta tabela, fluxo, revogação |
docs/architecture/EDGE_FUNCTIONS_CATALOG.md | ATUALIZAR — adicionar admin-sessions |
docs/security/SECURITY_AUDIT_2026-02-28.md | ATUALIZAR — marcar P2 (revogação) como concluído |
docs/operations/ALERTAS_PUSH.md | ATUALIZAR — novos triggers |
10. Ordem de Implementação
- Migração SQL (tabela
sessoes_ativas+ RLS) - Edge Function
admin-sessions(list_active, revoke, revoke_all_user, revoke_all) - Modificar
verify-otpeselect-rolepara registrar sessões - Modificar
logoutpara marcar revogação - Adicionar alertas ntfy em
send-otpeportal-escola(WhatsApp falho) - Componente
admin-sessoes.tsx+ hook + entrada no sidebar - Alerta de pico de acessos negados em
auth-helpers.ts - Documentação
11. Arquivos Envolvidos
| Arquivo | Ação |
|---|---|
supabase/functions/admin-sessions/index.ts | CRIAR |
supabase/config.toml | ADICIONAR entry |
src/components/admin-sessoes.tsx | CRIAR |
src/hooks/useAdminSessoes.ts | CRIAR |
src/components/sidebar-admin.tsx | EDITAR (novo item menu) |
src/App.tsx | EDITAR (renderizar nova seção) |
supabase/functions/verify-otp/index.ts | EDITAR (registrar sessão) |
supabase/functions/select-role/index.ts | EDITAR (registrar sessão) |
supabase/functions/logout/index.ts | EDITAR (marcar revogação) |
supabase/functions/send-otp/index.ts | EDITAR (alerta WhatsApp falho) |
supabase/functions/portal-escola/index.ts | EDITAR (alerta WhatsApp falho) |
supabase/functions/_shared/auth-helpers.ts | EDITAR (alerta pico acessos negados) |
docs/security/SESSION_MANAGEMENT.md | CRIAR |
docs/architecture/EDGE_FUNCTIONS_CATALOG.md | EDITAR |
docs/security/SECURITY_AUDIT_2026-02-28.md | EDITAR |
docs/operations/ALERTAS_PUSH.md | EDITAR |