Skip to content

About

An authentication server written in Java using Spring Boot and Hexagonal architecture

Resources

Stars

1 star

Watchers

1 watching

Forks

Latest commit

 

History

36 Commits

Folders and files

Repository files navigation

Authentication Server Spring (Auth Service)

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.

🚀 Tecnologias Utilizadas

  • 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 que foi feito?

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).

Funcionalidades Principais:

  1. 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.
  2. Confirmação de E-mail (GET /auth/confirmEmail/{code}):

    • Processo de verificação utilizando uma DelayQueue em 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.
  3. Autenticação/Login (POST /auth/authenticate):

    • Verificação de credenciais.
    • Geração de token JWT assinado com algoritmo HMAC256.
  4. 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 que é JWT?

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:

  1. Header: Tipo do token e algoritmo de criptografia (HS256).
  2. Payload: Contém as "claims" (declarações), como o ID do usuário, nome, papel (role) e datas de emissão/expiração.
  3. Signature: Assinatura gerada combinando o header, payload e uma chave secreta no servidor, garantindo que o token não foi alterado.

💡 Conceitos de Autenticação Abordados

1. Hashing de Senhas (BCrypt)

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.

2. Autenticação Stateless (Sem Estado)

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.

3. Claims e Sessions

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.

4. Expiração de Tokens

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.

5. Arquitetura Orientada a Ports e Adapters

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.


🏃 Como Rodar o Projeto

  1. Ambiente:

    • Certifique-se de ter o Docker instalado.
    • Suba os serviços de banco de dados:
      docker-compose up -d
  2. Configuração:

    • Verifique as credenciais no arquivo src/main/resources/application.properties.
  3. Execução:

    • Utilize o Maven Wrapper para rodar a aplicação:
      ./mvnw spring-boot:run

About

An authentication server written in Java using Spring Boot and Hexagonal architecture

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages