Skip to content

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 com jti + token_blacklist (já implementado em P2)


1. Resumo

Nova seção no painel administrativo com 2 abas:

  1. Sessões Ativas — lista usuários com JWT válido, permite revogar sessões individualmente ou em massa
  2. 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.sh

3. 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

ActionDescrição
list_activeLista sessões ativas: WHERE revogada_em IS NULL AND expira_em > NOW(), retorna usuário, papel, IP, cidade, horário
revokeRevoga sessão: marca revogada_em, insere jti na token_blacklist com motivo 'admin_revoke', loga em logs_transacoes, envia alerta push
revoke_all_userRevoga todas as sessões de um usuário (busca JTIs ativos)
revoke_allRevoga 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

ArquivoMudança
verify-otp/index.tsApós gerar JWT, inserir em sessoes_ativas (jti, usuário, IP, geo, expira_em)
select-role/index.tsIdem — novo JWT = nova sessão
logout/index.tsMarcar revogada_em = now() na sessão correspondente ao jti
send-otp/index.tsAdicionar enviarAlertaPush quando mensagem WhatsApp falha
portal-escola/index.tsAdicionar enviarAlertaPush quando WhatsApp portal falha

6. Expansão de Alertas ntfy.sh

Novos triggers além dos existentes:

TriggerPrioridade ntfyTags
WhatsApp falho em OTP (sistema)highwarning, phone
WhatsApp falho em OTP (portal)highwarning, phone
Revogação manual de sessãodefaultlock, admin
Revogação em massa (emergência)urgentrotating_light, skull
5+ acessos negados em 10min (mesmo IP)highpolice_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_transacoes com 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

ArquivoAção
docs/security/SESSION_MANAGEMENT.mdCRIAR — documenta tabela, fluxo, revogação
docs/architecture/EDGE_FUNCTIONS_CATALOG.mdATUALIZAR — adicionar admin-sessions
docs/security/SECURITY_AUDIT_2026-02-28.mdATUALIZAR — marcar P2 (revogação) como concluído
docs/operations/ALERTAS_PUSH.mdATUALIZAR — novos triggers

10. Ordem de Implementação

  1. Migração SQL (tabela sessoes_ativas + RLS)
  2. Edge Function admin-sessions (list_active, revoke, revoke_all_user, revoke_all)
  3. Modificar verify-otp e select-role para registrar sessões
  4. Modificar logout para marcar revogação
  5. Adicionar alertas ntfy em send-otp e portal-escola (WhatsApp falho)
  6. Componente admin-sessoes.tsx + hook + entrada no sidebar
  7. Alerta de pico de acessos negados em auth-helpers.ts
  8. Documentação

11. Arquivos Envolvidos

ArquivoAção
supabase/functions/admin-sessions/index.tsCRIAR
supabase/config.tomlADICIONAR entry
src/components/admin-sessoes.tsxCRIAR
src/hooks/useAdminSessoes.tsCRIAR
src/components/sidebar-admin.tsxEDITAR (novo item menu)
src/App.tsxEDITAR (renderizar nova seção)
supabase/functions/verify-otp/index.tsEDITAR (registrar sessão)
supabase/functions/select-role/index.tsEDITAR (registrar sessão)
supabase/functions/logout/index.tsEDITAR (marcar revogação)
supabase/functions/send-otp/index.tsEDITAR (alerta WhatsApp falho)
supabase/functions/portal-escola/index.tsEDITAR (alerta WhatsApp falho)
supabase/functions/_shared/auth-helpers.tsEDITAR (alerta pico acessos negados)
docs/security/SESSION_MANAGEMENT.mdCRIAR
docs/architecture/EDGE_FUNCTIONS_CATALOG.mdEDITAR
docs/security/SECURITY_AUDIT_2026-02-28.mdEDITAR
docs/operations/ALERTAS_PUSH.mdEDITAR