Visão geral
Não existe sessão no servidor: o JWT vale até expirar. Esta issue cria usuarios_sessoes e a persistência (criar, atualizar hash na rotação, apagar). Login HTTP fica na #516.
Ver _spec/auth-and-authorization.md §6.3–§6.4.
Fora de escopo
- Endpoints
/auth/*
- Cookie e CORS
- Tela de dispositivos
- Colunas de reuse-detection (
revoked_at, replaced_by_id, refresh_family_id)
Critérios de aceite
Detalhes técnicos
Nome: usuarios_sessoes (padrão usuarios, tipos_usuarios). Não usar auth_sessoes.
| Coluna |
Notas |
id |
UUID, também o claim sid do access JWT |
usuario_id |
FK usuarios.id |
refresh_token_hash |
SHA-256 ou HMAC do refresh atual |
created_at, last_used_at |
|
expires_at |
sliding 30 dias na renovação |
Não criar: client, device_label, revoked_at, replaced_by_id, refresh_family_id.
Persistência alinhada ao que o repo já usa para migration (Knex CLI em src/database/cli.ts / modelo Sequelize se a issue de sessão ficar no legado). Refresh opaco via crypto; guardar só o hash.
usuarios.ativo = false deve apagar as sessões no mesmo fluxo (transação ou equivalente) — o gancho pode completar na #516 se o desativar usuário já existir no controller.
Rotação (mesma linha):
await knex('usuarios_sessoes').where({ id: session.id }).update({
refresh_token_hash: hash(newRefresh),
last_used_at: now,
expires_at: addDays(now, 30),
})
Logout:
await knex('usuarios_sessoes').where({ id: session.id }).delete()
// all:
await knex('usuarios_sessoes').where({ usuario_id: user.id }).delete()
Visão geral
Não existe sessão no servidor: o JWT vale até expirar. Esta issue cria
usuarios_sessoese a persistência (criar, atualizar hash na rotação, apagar). Login HTTP fica na #516.Ver
_spec/auth-and-authorization.md§6.3–§6.4.Fora de escopo
/auth/*revoked_at,replaced_by_id,refresh_family_id)Critérios de aceite
usuarios_sessoescom as colunas abaixoDELETEda linha; encerrar todas / desativar usuário apaga todas as linhas deleid/sid)Detalhes técnicos
Nome:
usuarios_sessoes(padrãousuarios,tipos_usuarios). Não usarauth_sessoes.idsiddo access JWTusuario_idusuarios.idrefresh_token_hashcreated_at,last_used_atexpires_atNão criar:
client,device_label,revoked_at,replaced_by_id,refresh_family_id.Persistência alinhada ao que o repo já usa para migration (Knex CLI em
src/database/cli.ts/ modelo Sequelize se a issue de sessão ficar no legado). Refresh opaco viacrypto; guardar só o hash.usuarios.ativo = falsedeve apagar as sessões no mesmo fluxo (transação ou equivalente) — o gancho pode completar na #516 se o desativar usuário já existir no controller.Rotação (mesma linha):
Logout: