NoteBugsDocs

Começo

Autenticação

Sessão em cookie, token Bearer, os dois eixos de papel e o limite de requisições.

Toda instalação exige conta, e não há chave de ambiente nem de tela que desligue isso. A única exceção é o modo demonstração, em que qualquer pessoa entra sem credencial.

Duas credenciais, uma identidade

CredencialComo viajaPara quê
Sessãocookie HttpOnly, SameSite=Laxa interface, no navegador
Token de APIAuthorization: Bearer <token>scripts e integrações

As duas terminam na mesma identidade, e o cookie tem precedência: numa aba logada que também mandasse o cabeçalho, vale a identidade da sessão.

TOKEN=...   # copiado de Minha conta → Segurança

curl -s http://localhost:3000/api/board \
  -H "Authorization: Bearer $TOKEN"

Não há segredo de servidor a configurar

O token de sessão é opaco (32 bytes aleatórios), e o que fica gravado é o sha256 dele; a senha é derivada com scrypt. Nenhuma chave a gerar, rotacionar ou vazar: um dump do banco não devolve credencial utilizável.

O token de API

  • Existe um por pessoa: gerar de novo revoga o anterior, então revogar é uma ação só.
  • O valor em claro sai uma vez, na resposta que o criou. Perdeu, gera outro.
  • O que sobra na linha, além do sha256, são os quatro últimos caracteres, o suficiente para a tela dizer qual token o seu script carrega.

Dois eixos de papel, e vale o mais restrito

EixoDecide
User.roleas rotas fora de espaço: Configurações, Armazenamento, Backup, Reset, Espaços e Usuários
TenantMember.roleo que se pode fazer DENTRO de um espaço de trabalho

Um VIEWER da instalação não escreve em lugar nenhum, mesmo sendo MEMBER de um espaço. E ADMIN é membro implícito de todos: sem essa regra, um espaço cujo último membro saiu ficaria sem ninguém que pudesse devolver o acesso a ele.

A matriz, e a regra que a fecha

CaminhoExige
/api/health, /api/auth/*nada
/api/profile*apenas estar autenticado
/api/settings, /api/storage, /api/backup, /api/reset, /api/tenants, /api/usersADMIN, em qualquer método
qualquer outroGET/HEADVIEWER; escrita → MEMBER

/api/profile* tem entrada própria porque a regra padrão mandaria escrita para MEMBER, e isso trancaria um VIEWER fora do próprio perfil: ele não escreve no quadro, mas troca a própria senha e o próprio avatar.

A segunda conferência: qual espaço de trabalho

A conferência de papel não sabe de que espaço é o recurso: /api/cards/[id] traz só o id do card. Por isso o acesso ao espaço é conferido dentro da transação, junto com a leitura do recurso.

Não ser membro é 403, e não 404

Pedir um recurso de um espaço que a conta não alcança devolve 403, e não 404. Assim a resposta é a mesma para um id que existe e para um id inventado, e não revela quais espaços existem.

Controle de abuso

LimiteQuantoContado por
GeralNOTEBUGS_RATE_LIMIT (padrão 300) por minutoo IP
Login10 a cada 5 min, não configurávelIP + e-mail alvo

O contador do login inclui o e-mail alvo: num escritório atrás do mesmo IP, o erro de digitação de uma pessoa não tranca as outras. O 429 sempre traz Retry-After, em segundos.