/login — Entrar no sistema

Porta de entrada. Dois campos: identificador (e-mail ou username) e senha. É aqui que a organização do usuário é descoberta — a tela não pergunta qual é.

O que acontece na submissão

POST /auth/login sem sessão de banco: a organização é resolvida no plano de controle antes de qualquer consulta ao app_<org>.

  1. Identificador com @ → busca no ent-user-directory (email → org_id), com join em organizations para pegar o slug.
  2. Identificador sem @ → usa o slug enviado no payload; sem slug, cai na organização padrão.
  3. Dentro do contexto da organização: procura o usuário, confere a senha (bcrypt), grava a sessão e emite o JWT com sub, org_id e org.

O token vive no cookie token e é renovado silenciosamente pelo header X-New-Token a cada resposta. GET /auth/me devolve o perfil, os perfis adicionais e a união das permissões (superusuário recebe todos os códigos).

Estado real

Funciona bem para o caminho normal (e-mail + senha). Três lacunas:

1. Não existe “esqueci minha senha” [P]

Não há nenhum fluxo de recuperação no código. Produto de autosserviço, com cadastro público, sem reset de senha, gera chamado de suporte no primeiro dia.

2. Login por username só funciona na organização padrão [P]

A API aceita um slug de organização no payload, mas a tela não tem esse campo e o serviço não envia. O parâmetro existe e é inalcançável pela interface. Quem entra por e-mail não percebe; quem entra por username fora da demo, sim. Detalhe em flx-resolucao-tenant.

3. Sair não invalida o token [P]

POST /auth/logout revoga a sessão na tabela user_sessions, mas get_current_user só decodifica o JWT — não consulta a sessão. Na prática, o token continua válido até vencer (até 30 dias depois da última renovação). Bloquear um usuário também não derruba a sessão dele.

Detalhe de implementação que vale saber

O body global usa min-h-screen, o que criaria uma faixa de rolagem no mobile. Login e tela-signup contornam isso travando o overflow do html/body no mount e restaurando no unmount — se alguma tela pública nova apresentar rolagem estranha no celular, é este o padrão a copiar.

Lacunas

Rastreadas na fase-1-onboarding.