Visão geral
POST /login devolve { token, usuario } (JWT 2 dias). Clientes web e móveis precisam de access curto + refresh, regras no JSON, e logout que apaga a sessão. O login antigo permanece até a #524.
_spec/auth-and-authorization.md §6–§7.
Fora de escopo
- Autorizar rotas de negócio (
authorize)
- Remover
POST /login
- App móvel (só o contrato HTTP)
- Redefinição de senha (
token_troca_senha)
Critérios de aceite
Detalhes técnicos
Access JWT (~15 min): sub = usuarios.id, sid = id da sessão, typ = access, role = tipo_usuario_id (não autorizar por role), iat/exp. Não colocar rules no JWT.
Refresh: opaco, 30 dias sliding. Sempre no JSON e no cookie. Se cookie e body vierem juntos, o body ganha.
Login request: { "email", "senha" } — sem client.
Login response 200:
{
"access_token": "<jwt>",
"refresh_token": "<opaque>",
"token_type": "Bearer",
"expires_in": 900,
"user": {
"id": 1,
"nome": "…",
"email": "…",
"tipo_usuario_id": 1
},
"rules": [
{ "action": "read", "resource": "Tombo" }
]
}
user (não usuario). rules no topo (não abilities, sem version).
Refresh 401 se hash some ou expires_at passou (apagar linha expirada se existir).
Access expirado nas rotas de negócio (issue #517): código distinto de 401 “inválido” para o cliente renovar uma vez.
Manter POST /login em src/routes/usuarios.js.
Visão geral
POST /logindevolve{ token, usuario }(JWT 2 dias). Clientes web e móveis precisam de access curto + refresh, regras no JSON, e logout que apaga a sessão. O login antigo permanece até a #524._spec/auth-and-authorization.md§6–§7.Fora de escopo
authorize)POST /logintoken_troca_senha)Critérios de aceite
POST /auth/logincom e-mail/senha válidos devolve o payload abaixo +Set-Cookiede refreshPOST /auth/refreshaceita cookie ou body; rotaciona hash na mesma sessão; refresh antigo não valePOST /auth/logoutapaga a sessão atual;{ "all": true }com access válido apaga todasGET /auth/mecom Bearer access devolve{ user, rules }HttpOnly,Secure,SameSite=None, path/authX-Requested-With)POST /logininalteradoDetalhes técnicos
Access JWT (~15 min):
sub=usuarios.id,sid= id da sessão,typ=access,role=tipo_usuario_id(não autorizar porrole),iat/exp. Não colocarrulesno JWT.Refresh: opaco, 30 dias sliding. Sempre no JSON e no cookie. Se cookie e body vierem juntos, o body ganha.
Login request:
{ "email", "senha" }— semclient.Login response 200:
{ "access_token": "<jwt>", "refresh_token": "<opaque>", "token_type": "Bearer", "expires_in": 900, "user": { "id": 1, "nome": "…", "email": "…", "tipo_usuario_id": 1 }, "rules": [ { "action": "read", "resource": "Tombo" } ] }user(nãousuario).rulesno topo (nãoabilities, semversion).Refresh 401 se hash some ou
expires_atpassou (apagar linha expirada se existir).Access expirado nas rotas de negócio (issue #517): código distinto de 401 “inválido” para o cliente renovar uma vez.
Manter
POST /loginemsrc/routes/usuarios.js.