Skip to content

Assinatura de Relatórios

O servidor permite assinar relatórios digitalmente por papel (role), verificar assinaturas existentes e portar relatórios entre diferentes implantações (deployers).

Requer ENCRYPTION_KEY configurado para habilitar o ReportSigner.

Assinar — POST /api/v1/reports/:id/sign

Permissão: canSettings ou canInsert

Body:

json
{
  "role": "deployer",
  "origin": "My Company"
}
CampoObrigatórioDescrição
roleSimPapel da assinatura (ex: author, deployer, reviewer)
originNãoIdentificador da origem (ex: nome da empresa)

Resposta 200:

json
{
  "signed": true,
  "role": "deployer",
  "signatures": { ... }
}
StatusErroQuando
400validation_errorrole ausente
404not_foundRelatório não encontrado
422no_definitionRelatório sem definição
422parse_errorDefinição malformada
503not_configuredENCRYPTION_KEY não configurado

Verificar — GET /api/v1/reports/:id/signatures

Permissão: canList

Relatório assinado

json
{
  "byRole": {
    "deployer": {
      "valid": true,
      "origin": "My Company"
    },
    "author": {
      "valid": true,
      "origin": "Dev Team"
    },
    "export": {
      "valid": true,
      "origin": "verified-export",
      "identity": {
        "email": "user@acme.com",
        "verified_at": "2026-04-09T10:00:00.000Z",
        "domain": "acme.com"
      }
    }
  }
}

O campo identity está presente quando a assinatura foi gerada via Exportação Verificada (fluxo OTP). Ele registra o email verificado, o domínio e o momento da verificação — útil para auditoria e rastreabilidade.

Relatório não assinado

json
{
  "unsigned": true,
  "byRole": {}
}
StatusErroQuando
404not_foundRelatório não encontrado
422parse_errorDefinição malformada
503not_configuredENCRYPTION_KEY não configurado

Portar — POST /api/v1/reports/:id/port

Permissão: canSettings

Permite transferir um relatório entre implantações diferentes, mantendo assinaturas selecionadas e adicionando uma nova.

Body:

json
{
  "keepRoles": ["author"],
  "newRole": "deployer",
  "newOrigin": "New Company"
}
CampoObrigatórioDefaultDescrição
keepRolesNão["author"]Roles a manter na portabilidade
newRoleSimRole da nova assinatura
newOriginNãoOrigem da nova assinatura

Resposta 200:

json
{
  "ported": true,
  "newRole": "deployer",
  "keepRoles": ["author"],
  "signatures": { ... }
}
StatusErroQuando
400validation_errornewRole ausente
404not_foundRelatório não encontrado
422no_definitionRelatório sem definição
422parse_errorDefinição malformada
503not_configuredENCRYPTION_KEY não configurado

Fluxo típico

Desenvolvedor (author)          Empresa A (deployer)         Empresa B (deployer)
        │                              │                            │
   sign(author)                        │                            │
        │──────── entrega ────────────▶│                            │
        │                         sign(deployer)                    │
        │                              │                            │
        │                              │──── port(keep:author) ────▶│
        │                              │                       sign(deployer)
        │                              │                            │
        │                         verify:                      verify:
        │                          author ✅                    author ✅
        │                          deployer ✅                  deployer ✅

Sulfite do 🇧🇷 para o mundo © 2026 Rafael S. Pinheiro