[DÚVIDA] Fluxo de Autenticação e Sessão
Estou desenvolvendo um projetinho de estudo que devo postar nas próximas semanas e me surgiu uma dúvida.
Atualmente, o fluxo de autenticação e gerenciamento de sessão está estruturado da seguinte maneira:
1. Autenticação
O usuário se autentica através da rota /api/auth/login
, e são gerados três dados sessionId
, authToken
e refreshToken
2. Armazenamento do RefreshToken
O refreshToken é armazenado no banco de dados para consultas futuras, permitindo a revalidação do authToken ou a finalização da sessão do usuário.
3. Armazenamento no Redis
O sessionId
é armazenado no Redis com um valor único (uuid).
4. Acesso às Rotas Privadas
Quando o usuário acessa as rotas privadas, ele envia o authToken
no cabeçalho Authorization
. O middleware de autenticação (authMiddleware
) realiza os seguintes passos:
- Verifica se o token existe e se é válido.
- Se o token for válido, verifica no Redis se há uma sessão ativa associada ao sessionId.
5. Sessão Ativa
Caso haja uma sessão ativa, o usuário é recuperado através do uuid e os dados do usuário são disponibilizados para os serviços da aplicação.
6. Sessão Inativa
Se a sessão não for ativa, o middleware verifica se o refreshToken está presente e é válido. Se o refreshToken for válido, um novo sessionId e authToken são gerados para o usuário, mantendo a sessão ativa. Caso contrário, o usuário é deslogado, a sessão é removida e o refreshToken é revogado.
Devo criptografar o uuid antes de armazená-lo no Redis ou ele deve ser armazenado de forma direta? Qual seria a melhor abordagem para garantir a segurança? O fluxo está bem estruturado ou há falhas que precisam ser corrigidas?
Criei um fluxograma para visualizar o fluxo de autenticação, caso alguém tenha sugestões ou perceba incoerências, ficaria grato pelos comentários.
OBS: Sei que o fluxograma não está completo, pois não adicionei como seria a parte de gerenciamento de sessão no front-end e provavelmente faltam informações sobre como os tokens são revogados, além do que acontece especificamente quando o usuário realiza o logout, mas o intuito é ter uma ideia geral.