Este projeto é um servidor de autenticação robusto e escalável desenvolvido em Java 21 utilizando Spring Boot 3. O objetivo principal é fornecer uma base sólida para gerenciamento de usuários, autenticação e autorização baseada em tokens.
- Java 21: Versão mais recente do Java com suporte a longo prazo (LTS).
- Spring Boot 3.4.5: Framework principal para construção de microserviços.
- Spring Data JPA: Abstração de persistência de dados.
- PostgreSQL: Banco de dados relacional para persistência de usuários.
- Flyway: Ferramenta de migração de banco de dados para controle de versão do schema.
- JSON Web Tokens (JWT): Utilizado para autenticação stateless (biblioteca
java-jwt). - BCrypt (jBCrypt): Algoritmo de hashing seguro para armazenamento de senhas.
- Lombok: Redução de código boilerplate.
- Docker: Orquestração de ambiente (PostgreSQL e Redis).
O projeto foi construído seguindo princípios de Clean Architecture e Arquitetura Hexagonal, separando a lógica de negócio (core) dos detalhes de implementação (domain e http).
-
Registro de Usuário (
POST /auth/register):- Validação de dados de entrada.
- Criptografia de senha com salt dinâmico (BCrypt).
- Verificação de unicidade de e-mail.
- Geração de código de confirmação.
-
Confirmação de E-mail (
GET /auth/confirmEmail/{code}):- Processo de verificação utilizando uma
DelayQueueem memória para expiração automática de códigos. - Ativação da conta do usuário após confirmação.
- Emissão do primeiro "Passport" (JWT) após o sucesso.
- Processo de verificação utilizando uma
-
Autenticação/Login (
POST /auth/authenticate):- Verificação de credenciais.
- Geração de token JWT assinado com algoritmo HMAC256.
-
Validação de Token (
GET /auth/validateToken):- Verificação da integridade e expiração do token JWT.
- Extração de claims e sessão do usuário.
O JSON Web Token (JWT) é um padrão aberto (RFC 7519) que define uma maneira compacta e independente de transmitir informações com segurança entre as partes como um objeto JSON.
Neste projeto, o JWT é composto por três partes:
- Header: Tipo do token e algoritmo de criptografia (HS256).
- Payload: Contém as "claims" (declarações), como o ID do usuário, nome, papel (role) e datas de emissão/expiração.
- Signature: Assinatura gerada combinando o header, payload e uma chave secreta no servidor, garantindo que o token não foi alterado.
Nunca armazenamos senhas em texto puro. Utilizamos o BCrypt, que incorpora um "salt" (valor aleatório) para proteger contra ataques de dicionário e tabelas arco-íris (rainbow tables). Além disso, o BCrypt é deliberadamente lento para resistir a ataques de força bruta.
Diferente das sessões tradicionais em que o servidor armazena dados do usuário na memória, o JWT permite autenticação stateless. Toda a informação necessária para identificar o usuário está contida no próprio token. Isso facilita a escalabilidade horizontal, pois qualquer instância do servidor pode validar o token sem consultar uma sessão centralizada.
O projeto encapsula informações do usuário em um objeto Session que é serializado e inserido no token como uma claim personalizada. Isso permite que o backend recupere o contexto do usuário rapidamente sem acessos repetitivos ao banco de dados.
A segurança é reforçada através da expiração de tokens (configurada para 1 hora). Isso limita a janela de oportunidade caso um token seja interceptado.
A separação clara entre as interfaces (PassportEncoder, PasswordEncoder) e suas implementações (JWTPassportEncoder, BCryptPasswordEncoder) permite que a tecnologia de autenticação seja trocada facilmente sem afetar a lógica de negócio central.
-
Ambiente:
- Certifique-se de ter o Docker instalado.
- Suba os serviços de banco de dados:
docker-compose up -d
-
Configuração:
- Verifique as credenciais no arquivo
src/main/resources/application.properties.
- Verifique as credenciais no arquivo
-
Execução:
- Utilize o Maven Wrapper para rodar a aplicação:
./mvnw spring-boot:run
- Utilize o Maven Wrapper para rodar a aplicação: