UserSession representa uma sessão autenticada do usuário. Ela permite revogar acesso antes da expiração do accessToken, controlar refresh tokens e encerrar sessões automaticamente quando regras de segurança exigirem.
Campos
| Campo | Tipo | Descrição |
|---|---|---|
userSessionId | UUID | Identificador único da sessão. Também é usado como sid nos tokens |
userId | UUID | Referência ao usuário autenticado |
audience | UserSessionAudience | Superfície onde a sessão foi criada |
refreshTokenHash | String | Hash unidirecional do refresh token ativo da sessão |
deviceId | String? | Identificador estável do dispositivo, quando informado pelo cliente |
deviceName | String? | Nome exibível do dispositivo |
userAgent | String? | User agent capturado no login ou refresh |
ipAddress | String? | IP capturado no login ou refresh |
status | UserSessionStatus | Estado manual da sessão. Default: ACTIVE |
lastUsedAt | DateTime | Última vez em que a sessão foi usada em autenticação ou refresh |
refreshExpiresAt | DateTime | Data limite para uso do refresh token |
inactivityExpiresAt | DateTime? | Data limite por inatividade, quando a política estiver habilitada |
revokedAt | DateTime? | Data de revogação manual ou automática |
revokedBy | UUID? | Usuário que revogou a sessão, quando a revogação for manual |
revokedReason | String? | Motivo técnico ou operacional da revogação |
createdBy | UUID? | Usuário que criou a sessão, quando aplicável |
createdAt | DateTime | Data de criação |
updatedBy | UUID? | Usuário que fez a última atualização, quando aplicável |
updatedAt | DateTime | Data da última atualização |
Relacionamentos
- Relaciona-se com User
Persistência
UserSession é persistida como estado server-side da autenticação. A aplicação precisa consultar a sessão pelo sid recebido no token e listar sessões por usuário para logout global e gestão de dispositivos.
| Acesso | Critério | Uso |
|---|---|---|
| Buscar sessão por token | userSessionId | Validar o sid em cada requisição autenticada |
| Listar sessões do usuário | userId | Exibir dispositivos ativos e executar logout global |
| Filtrar sessões por audiência | userId + audience | Consultar sessões abertas por superfície |
Regras de Negócio
- O
accessTokennão é persistido. Ele carregasid,sub,aud,type,iateexp. - A sessão não guarda
organizationId,membershipId, roles ou permissions. Escopo e autorização são resolvidos pelo Profile e pelas regras do domínio de Authorization. - O refresh token nunca é armazenado em texto puro nem com criptografia reversível. Apenas
refreshTokenHashé persistido. - A cada refresh bem-sucedido, um novo refresh token é emitido e
refreshTokenHashé atualizado. EXPIREDnão é status persistido. Expiração é calculada porrefreshExpiresAteinactivityExpiresAt.- A sessão é inválida quando
status = REVOKED,refreshExpiresAtpassou ouinactivityExpiresAtpassou. - Alteração de senha, bloqueio de usuário, logout e logout global revogam sessões atualizando o estado da sessão por
sid. - A audiência da sessão precisa bater com o
audrecebido no token.
Enums
UserSessionAudience
| Valor | Descrição |
|---|---|
CUSTOMER | Sessão do app ou portal de passageiros |
OPS | Sessão operacional de empresa ou cooperativa |
DRIVER | Sessão do app de motorista |
BACKOFFICE | Sessão administrativa da plataforma |
UserSessionStatus
| Valor | Descrição |
|---|---|
ACTIVE | Sessão ativa e elegível para autenticação |
REVOKED | Sessão encerrada manual ou automaticamente |