Um serviço de autenticação moderno e robusto com login em duas etapas (código de autorização por e-mail + challenge token), emissão de access token (JWT) e refresh token, autocadastro, reset de senha e logout seguro.
- Autenticação de Dois Fatores - 2FA.
- Renovação de sessão para obter novos tokens e atualizar o cookie com TTL consistente.
- Autocadastro por e-mail com token de conclusão e política de senha segura.
- Reset de senha com token enviado por e-mail, revogando sessões anteriores.
- Proteção de endpoints de aplicação com JWT e limite de dispositivos ativos por usuário.
- Java 21, Spring Boot 3.5
- Spring Security, Web, Validation, Data JPA
- JWT via
jjwt - OpenAPI/Swagger (
springdoc) - PostgreSQL (produção) e H2 (testes)
- Lombok
Contexto base: /api
- POST /auth/login — inicia login, retorna
challengeTokene enviaauthorizationCodepor e-mail. - POST /auth/login/complete — conclui login com
challengeToken+authorizationCode, retornaaccessTokene seta cookierefreshToken(HttpOnly,Secure,SameSite=Strict). - POST /auth/login/refresh — renova tokens usando
Authorization: Bearer <jwt>+ cookierefreshToken. - POST /auth/logout — revoga o
access tokene orefresh tokendo cookie. - POST /auth/register — autocadastro com e-mail e nome.
- POST /auth/register/complete — conclusão de cadastro com
token+ novasenha. - POST /auth/password/reset — solicita e-mail com token para reset.
- POST /auth/password/reset/complete — redefine a senha com
token.
- Iniciar login
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"acesso":"user@exemplo.com","senha":"MinhaSenhaForte123!"}'
# Resposta: { "challengeToken": "..." } e um código de autorização é enviado por e-mail- Concluir login (use o
challengeTokene o código recebido por e-mail)
curl -X POST http://localhost:8080/api/auth/login/complete \
-H "Content-Type: application/json" \
-d '{"challengeToken":"...","authorizationCode":"123456"}'
# Resposta: { "accessToken": "jwt..." } e cookie HttpOnly `refreshToken` é definido- Renovar tokens
curl -X POST http://localhost:8080/api/auth/login/refresh \
-H "Authorization: Bearer <access_jwt_expirado_ou_valido>" \
--cookie "refreshToken=<valor_do_cookie>"
# Resposta: novo access token e novo cookie refresh- Logout
curl -X POST http://localhost:8080/api/auth/logout \
-H "Authorization: Bearer <access_jwt>" \
--cookie "refreshToken=<valor_do_cookie>"
# Resposta: 204 e cookie de refresh é apagado- Controlador:
src/main/java/com/sachetto/autenticacao/controller/* - Serviços:
src/main/java/com/sachetto/autenticacao/service/auth/* - Repositórios:
src/main/java/com/sachetto/autenticacao/repository/auth/* - DTOs/Validações:
src/main/java/com/sachetto/autenticacao/dto/*,src/main/java/com/sachetto/autenticacao/validation/*