Solução .NET 8 para cadastro e autenticação de usuários com envio de e‑mail. Projeto estruturado em camadas (API → Application → Domain → Infra) com padrões de mercado (DI, Repository, UnitOfWork, JWT, MailKit).
Fornecer uma aplicação backend para:
- Registro de usuário (hash de senha, atribuição de role).
- Login com JWT (token de acesso) + refresh token (persistência em cookie HTTP‑only).
- Envio de e‑mail (MailKit) — ambiente de desenvolvimento com Mailpit via Docker.
PP.API— Controllers / endpoints REST (ex.:UserController).PP.Application— Serviços de aplicação (UserService, EmailSendService), DTOs e contratos.PP.Domain— Entidades e interfaces (contratos de repositório).PP.Infra— Implementações EF Core, repositórios, migrations e extensões de DI (InfraExtension).
Padrões aplicados: Dependency Injection, Repository, UnitOfWork, separação por interfaces (facilita testes e substituição de implementações).
- Endpoints:
POST /v1/user/register— registra usuário e envia e‑mail de boas‑vindas.POST /v1/user/login— autentica e retorna JWT de acesso; grava refresh token em cookie HTTP‑only.POST /v1/user/logout— limpa cookie de refresh token.POST /v1/user/refresh— (ponto preparado para refresh token flow).
- Envio de e‑mail usando MailKit.
- Persistência em SQL Server via EF Core.
- Tokens:
- Tempo de vida do access token: ~5 minutos (definido no serviço de geração de token).
- Tempo de vida do refresh token: ~20 minutos (cookie expirado em 20min).
- Endpoints expostos: 4 (register, login, logout, refresh).
- Ports (docker):
- App:
8080/8081 - SQL Server:
1433 - Mailpit UI:
8025(SMTP1025)
- App:
- Organização: separação em 4 projetos principais (API, Application, Domain, Infra).
- Dependências críticas: EF Core, MailKit, JWT packages.
Observação: métricas como cobertura de testes, latência e throughput não estão implementadas — recomenda-se adicionar CI com testes e métricas (Prometheus/Zipkin/Application Insights).
O docker-compose.yaml orquestra três serviços para ambiente de desenvolvimento:
app- Constrói a imagem a partir do
Dockerfiledo repositório. - Variáveis de ambiente para desenvolvimento:
ASPNETCORE_ENVIRONMENT=DevelopmenteEmailSettings__*para apontar o SMTP para o containermailpit. - Depende de
databaseemailpit(start order). - Expõe portas
8080:8080e8081:8081.
- Constrói a imagem a partir do
database- Imagem oficial do SQL Server 2022.
- Volume
sqlvolumepara persistência dos dados. - Porta mapeada
1433:1433.
mailpit- Ferramenta para capturar e visualizar e‑mails localmente (UI em
8025, SMTP em1025). - Volume
mailpit-datapara persistência de mensagens.
- Ferramenta para capturar e visualizar e‑mails localmente (UI em
Propósito: permitir desenvolvimento e testes locais (registro/login + envio de e‑mail) sem dependências externas.
- Ajuste segredos locais: defina
ConnectionStrings:DefaultConnection,Jwt:Key,Jwt:Issuer,Jwt:Audience(use dotnet user-secrets ou variáveis de ambiente). - No diretório do projeto:
- docker compose up --build
- Acesse:
- API: http://localhost:8080 (ou 8081 conforme configuração)
- Mailpit UI: http://localhost:8025
- Rotas principais:
/v1/user/register,/v1/user/login
- Estrutura modular e clara, com separação de responsabilidades.
- Fluxo de autenticação baseado em JWT + refresh token.
- Ambiente reproducível via Docker (SQL Server + Mailpit).
- Uso de padrões que facilitam testes e manutenção.
- Segurança de segredos: mover JWT key, DB password para vaults/secret store (User Secrets em dev, Azure Key Vault em produção).
- Não enviar senha em texto por e‑mail — usar flow de confirmação/ativação com token ou link de reset.
- Persistência e rotação de refresh tokens: salvar no banco, validar expiração e revogação.
- HTTPS e cookie
Secure: cookie atual usaSecure=true— requer HTTPS em produção; permitir configuração por ambiente. - Logging e observabilidade: adicionar
ILogger, correlação de requests, métricas e tracing. - Testes automatizados: unit tests para serviços e integração para fluxo de autenticação.
- Tratamento de exceções: evitar expor mensagens de erro cruas; padronizar responses de erro.
- Single Responsibility: controllers apenas orquestram; services cuidam da lógica de aplicação; repositórios cuidam do acesso a dados.
- Open/Closed: serviços consomem interfaces; novas implementações podem ser adicionadas sem alterar consumidores.
- Liskov: implementações seguem contratos de interface (substituição possível por mocks).
- Interface Segregation: interfaces específicas para e‑mail, token, usuários.
- Dependency Inversion: camadas superiores dependem de abstrações; infraestrutura fornece implementações via DI (
InfraExtension).
- Maturidade: arquitetura madura para desenvolvimento (intermediária). Bom design, porém precisa de hardening para produção (segurança, testes, observabilidade, validação e tratamento robusto de erros).
- Recomendações iniciais de roadmap: 1) segredos e segurança 2) persistência/validação de refresh tokens 3) testes automáticos 4) logging/monitoramento.