Login com gov.br (OIDC) — registro, backend, frontend #1

Open
opened 2026-04-30 04:04:15 -03:00 by navigator · 0 comments
Owner

Contexto

Plataforma hoje é HTML estático servido por nginx. Não há backend de sessão. Login com gov.br abre as portas para features que dependem de identidade verificada (reportar contratos suspeitos, alertas, painel pessoal de auditor).

Fase 0 — externo (pré-requisito)

  • Registrar app no portal gov.br (CPF do responsável + CNPJ Pop Solutions)
  • Obter client_id + client_secret no ambiente staging (sso.staging.acesso.gov.br)
  • Whitelistar callback https://soberaniadigital.org.br/auth/callback
  • Submeter para aprovação em produção quando staging validar

Fase 1 — backend

  • Criar api/auth.py (FastAPI + Authlib) com /auth/login, /auth/callback, /auth/me, /auth/logout
  • Migration SQL users (id, cpf hashed, nome, email, govbr_nivel bronze/prata/ouro, foto_url, created_at, last_login_at, role)
  • Sessão via cookie assinado (itsdangerous) ou JWT — TTL 24h, refresh transparente
  • Logging de eventos de auth (login_ok, login_fail, logout) sem expor PII
  • Tests E2E com mock do gov.br

Fase 2 — frontend

  • Botão "Entrar com gov.br" no index.html (header)
  • Estado autenticado no Alpine store ($store.auth.user)
  • Visual feedback do nível (bronze/prata/ouro) na avatar
  • /auth/logout link

Fase 3 — operação

  • systemd unit soberania-api.service + env file /etc/soberania/secrets.env carregando GOVBR_CLIENT_ID, GOVBR_CLIENT_SECRET, SESSION_SECRET, PGPASSWORD
  • nginx route /auth/* e /api/* → uvicorn :8081
  • Migrar do staging gov.br para produção quando aprovado

Riscos / decisões

  • CPF é PII regulado por LGPD — armazenar HASH (SHA-256 + pepper), nunca em claro. Email do gov.br é OK guardar em claro (com consentimento).
  • Bronze (autodeclarado) vs Prata (validação biométrica) vs Ouro (presencial) — definir o nível mínimo por feature: leitura pública = sem login; reportar contrato = bronze; admin = ouro.

Documentação

## Contexto Plataforma hoje é HTML estático servido por nginx. Não há backend de sessão. Login com gov.br abre as portas para features que dependem de identidade verificada (reportar contratos suspeitos, alertas, painel pessoal de auditor). ## Fase 0 — externo (pré-requisito) - [ ] Registrar app no portal gov.br (CPF do responsável + CNPJ Pop Solutions) - [ ] Obter `client_id` + `client_secret` no ambiente staging (`sso.staging.acesso.gov.br`) - [ ] Whitelistar callback `https://soberaniadigital.org.br/auth/callback` - [ ] Submeter para aprovação em produção quando staging validar ## Fase 1 — backend - [ ] Criar `api/auth.py` (FastAPI + Authlib) com `/auth/login`, `/auth/callback`, `/auth/me`, `/auth/logout` - [ ] Migration SQL `users` (`id`, `cpf` hashed, `nome`, `email`, `govbr_nivel` bronze/prata/ouro, `foto_url`, `created_at`, `last_login_at`, `role`) - [ ] Sessão via cookie assinado (`itsdangerous`) ou JWT — TTL 24h, refresh transparente - [ ] Logging de eventos de auth (login_ok, login_fail, logout) sem expor PII - [ ] Tests E2E com mock do gov.br ## Fase 2 — frontend - [ ] Botão "Entrar com gov.br" no `index.html` (header) - [ ] Estado autenticado no Alpine store (`$store.auth.user`) - [ ] Visual feedback do nível (bronze/prata/ouro) na avatar - [ ] `/auth/logout` link ## Fase 3 — operação - [ ] systemd unit `soberania-api.service` + env file `/etc/soberania/secrets.env` carregando `GOVBR_CLIENT_ID`, `GOVBR_CLIENT_SECRET`, `SESSION_SECRET`, `PGPASSWORD` - [ ] nginx route `/auth/*` e `/api/*` → uvicorn :8081 - [ ] Migrar do staging gov.br para produção quando aprovado ## Riscos / decisões - CPF é PII regulado por LGPD — armazenar HASH (SHA-256 + pepper), nunca em claro. Email do gov.br é OK guardar em claro (com consentimento). - Bronze (autodeclarado) vs Prata (validação biométrica) vs Ouro (presencial) — definir o nível mínimo por feature: leitura pública = sem login; reportar contrato = bronze; admin = ouro. ## Documentação - Manual oficial: https://manual-roteiro-integracao-login-unico.servicos.gov.br/ - Authlib OIDC client: https://docs.authlib.org/en/latest/client/fastapi.html
Sign in to join this conversation.
No description provided.